]> source.dussan.org Git - poi.git/commitdiff
SonarQube fixes and removed redundant logger level checks, for simple String messages
authorAndreas Beeker <kiwiwings@apache.org>
Sat, 11 Feb 2017 00:57:39 +0000 (00:57 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Sat, 11 Feb 2017 00:57:39 +0000 (00:57 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1782548 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/model/InternalWorkbook.java
src/scratchpad/src/org/apache/poi/hwpf/converter/WordToHtmlConverter.java

index 976c888ce8c3ec07246b8a842e0be2d7bd8d25d9..7bddcdd6705eb82455384ea6d97893deec5907a5 100644 (file)
 
 package org.apache.poi.hssf.model;
 
+import static org.apache.poi.util.POILogger.DEBUG;
+
 import java.security.AccessControlException;
 import java.security.GeneralSecurityException;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -137,7 +138,7 @@ public final class InternalWorkbook {
     private static final int MAX_SENSITIVE_SHEET_NAME_LEN = 31;
 
     /**
-     * Normally, the Workbook will be in a POIFS Stream called 
+     * Normally, the Workbook will be in a POIFS Stream called
      *  "Workbook". However, some weird XLS generators use "WORKBOOK"
      *  or "BOOK".
      */
@@ -153,14 +154,13 @@ public final class InternalWorkbook {
      */
     public static final String OLD_WORKBOOK_DIR_ENTRY_NAME = "Book";
 
-    private static final POILogger log = POILogFactory.getLogger(InternalWorkbook.class);
-    private static final int DEBUG = POILogger.DEBUG;
+    private static final POILogger LOG = POILogFactory.getLogger(InternalWorkbook.class);
 
     /**
      * constant used to set the "codepage" wherever "codepage" is set in records
      * (which is duplicated in more than one record)
      */
-    private final static short CODEPAGE = 0x04B0;
+    private static final short CODEPAGE = 0x04B0;
 
     /**
      * this contains the Worksheet record objects
@@ -231,147 +231,130 @@ public final class InternalWorkbook {
      * @return Workbook object
      */
     public static InternalWorkbook createWorkbook(List<Record> recs) {
-        if (log.check( POILogger.DEBUG )) {
-            log.log(DEBUG, "Workbook (readfile) created with reclen=",
-                    Integer.valueOf(recs.size()));
-        }
+        LOG.log(DEBUG, "Workbook (readfile) created with reclen=", recs.size());
         InternalWorkbook retval = new InternalWorkbook();
         List<Record> records = new ArrayList<Record>(recs.size() / 3);
         retval.records.setRecords(records);
 
-        int k;
-        for (k = 0; k < recs.size(); k++) {
+        boolean eofPassed = false;
+        for (int k = 0; k < recs.size(); k++) {
             Record rec = recs.get(k);
-
-            if (rec.getSid() == EOFRecord.sid) {
-                records.add(rec);
-                if (log.check( POILogger.DEBUG )) {
-                    log.log(DEBUG, "found workbook eof record at " + k);
-                }
-                break;
-            }
+            String logObj;
             switch (rec.getSid()) {
 
+                case EOFRecord.sid :
+                    logObj = "workbook eof";
+                    break;
+
                 case BoundSheetRecord.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found boundsheet record at " + k);
-                    }
+                    logObj = "boundsheet";
                     retval.boundsheets.add((BoundSheetRecord) rec);
                     retval.records.setBspos( k );
                     break;
 
                 case SSTRecord.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found sst record at " + k);
-                    }
+                    logObj = "sst";
                     retval.sst = ( SSTRecord ) rec;
                     break;
 
                 case FontRecord.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found font record at " + k);
-                    }
+                    logObj = "font";
                     retval.records.setFontpos( k );
                     retval.numfonts++;
                     break;
 
                 case ExtendedFormatRecord.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found XF record at " + k);
-                    }
+                    logObj = "XF";
                     retval.records.setXfpos( k );
                     retval.numxfs++;
                     break;
 
                 case TabIdRecord.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found tabid record at " + k);
-                    }
+                    logObj = "tabid";
                     retval.records.setTabpos( k );
                     break;
 
                 case ProtectRecord.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found protect record at " + k);
-                    }
+                    logObj = "protect";
                     retval.records.setProtpos( k );
                     break;
 
                 case BackupRecord.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found backup record at " + k);
-                    }
+                    logObj = "backup";
                     retval.records.setBackuppos( k );
                     break;
+
                 case ExternSheetRecord.sid :
-                    throw new RuntimeException("Extern sheet is part of LinkTable");
+                    throw new RecordFormatException("Extern sheet is part of LinkTable");
+
                 case NameRecord.sid :
                 case SupBookRecord.sid :
                     // LinkTable can start with either of these
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found SupBook record at " + k);
-                    }
+                    LOG.log(DEBUG, "found SupBook record at " + k);
                     retval.linkTable = new LinkTable(recs, k, retval.records, retval.commentRecords);
                     k+=retval.linkTable.getRecordCount() - 1;
                     continue;
+
                 case FormatRecord.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found format record at " + k);
-                    }
-                    retval.formats.add((FormatRecord) rec);
-                    retval.maxformatid = retval.maxformatid >= ((FormatRecord)rec).getIndexCode() ? retval.maxformatid : ((FormatRecord)rec).getIndexCode();
+                    logObj = "format";
+                    FormatRecord fr = (FormatRecord) rec;
+                    retval.formats.add(fr);
+                    retval.maxformatid = retval.maxformatid >= fr.getIndexCode() ? retval.maxformatid : fr.getIndexCode();
                     break;
+
                 case DateWindow1904Record.sid :
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found datewindow1904 record at " + k);
-                    }
+                    logObj = "datewindow1904";
                     retval.uses1904datewindowing = ((DateWindow1904Record)rec).getWindowing() == 1;
                     break;
+
                 case PaletteRecord.sid:
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found palette record at " + k);
-                    }
+                    logObj = "palette";
                     retval.records.setPalettepos( k );
                     break;
+
                 case WindowOneRecord.sid:
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found WindowOneRecord at " + k);
-                    }
+                    logObj = "WindowOneRecord";
                     retval.windowOne = (WindowOneRecord) rec;
                     break;
+
                 case WriteAccessRecord.sid:
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found WriteAccess at " + k);
-                    }
+                    logObj = "WriteAccess";
                     retval.writeAccess = (WriteAccessRecord) rec;
                     break;
+
                 case WriteProtectRecord.sid:
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found WriteProtect at " + k);
-                    }
+                    logObj = "WriteProtect";
                     retval.writeProtect = (WriteProtectRecord) rec;
                     break;
+
                 case FileSharingRecord.sid:
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found FileSharing at " + k);
-                    }
+                    logObj = "FileSharing";
                     retval.fileShare = (FileSharingRecord) rec;
                     break;
 
                 case NameCommentRecord.sid:
+                    logObj = "NameComment";
                     final NameCommentRecord ncr = (NameCommentRecord) rec;
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG, "found NameComment at " + k);
-                    }
                     retval.commentRecords.put(ncr.getNameText(), ncr);
                     break;
+
+                case HyperlinkRecord.sid:
+                    // Look for other interesting values that follow the EOFRecord
+                    logObj = "Hyperlink";
+                    retval.hyperlinks.add((HyperlinkRecord)rec);
+                    break;
+
                 default:
-                    if (log.check( POILogger.DEBUG )) {
-                        log.log(DEBUG,  "ignoring record (sid=" + rec.getSid() + ") at " + k);
-                    }
+                    logObj = "(sid=" + rec.getSid() + ")";
                     break;
             }
-            records.add(rec);
+            if (!eofPassed) {
+                records.add(rec);
+            }
+            LOG.log(DEBUG, "found "+logObj+" record at " + k);
+            if (rec.getSid() == EOFRecord.sid) {
+                eofPassed = true;
+            }
         }
         //What if we dont have any ranges and supbooks
         //        if (retval.records.supbookpos == 0) {
@@ -379,39 +362,22 @@ public final class InternalWorkbook {
         //            retval.records.namepos    = retval.records.supbookpos + 1;
         //        }
 
-        // Look for other interesting values that
-        //  follow the EOFRecord
-        for ( ; k < recs.size(); k++) {
-            Record rec = recs.get(k);
-            switch (rec.getSid()) {
-                case HyperlinkRecord.sid:
-                    retval.hyperlinks.add((HyperlinkRecord)rec);
-                    break;
-                default:
-                    break;
-            }
-        }
-
         if (retval.windowOne == null) {
             retval.windowOne = createWindowOne();
         }
-        if (log.check( POILogger.DEBUG )) {
-            log.log(DEBUG, "exit create workbook from existing file function");
-        }
+        LOG.log(DEBUG, "exit create workbook from existing file function");
         return retval;
     }
 
     /**
      * Creates an empty workbook object with three blank sheets and all the empty
      * fields.  Use this to create a workbook from scratch.
-     * 
+     *
      * @return an empty workbook object
      */
-    public static InternalWorkbook createWorkbook()
-    {
-        if (log.check( POILogger.DEBUG )) {
-            log.log( DEBUG, "creating new workbook from scratch" );
-        }
+    public static InternalWorkbook createWorkbook() {
+        LOG.log( DEBUG, "creating new workbook from scratch" );
+
         InternalWorkbook retval = new InternalWorkbook();
         List<Record> records = new ArrayList<Record>( 30 );
         retval.records.setRecords(records);
@@ -484,9 +450,8 @@ public final class InternalWorkbook {
         records.add(InternalWorkbook.createExtendedSST());
 
         records.add(EOFRecord.instance);
-        if (log.check( POILogger.DEBUG )) {
-            log.log( DEBUG, "exit create new workbook from scratch" );
-        }
+        LOG.log( DEBUG, "exit create new workbook from scratch" );
+
         return retval;
     }
 
@@ -544,12 +509,12 @@ public final class InternalWorkbook {
 
     /**
      * Retrieves the index of the given font
-     * 
+     *
      * @param font the font
-     * 
+     *
      * @return the font index
-     * 
-     * @throws IllegalArgumentException if the font index can't be determined 
+     *
+     * @throws IllegalArgumentException if the font index can't be determined
      */
     public int getFontIndex(FontRecord font) {
         for(int i=0; i<=numfonts; i++) {
@@ -557,10 +522,7 @@ public final class InternalWorkbook {
                 ( FontRecord ) records.get((records.getFontpos() - (numfonts - 1)) + i);
             if(thisFont == font) {
                 // There is no 4!
-                if(i > 3) {
-                    return (i+1);
-                }
-                return i;
+                return (i > 3) ? i+1 : i;
             }
         }
         throw new IllegalArgumentException("Could not find that font!");
@@ -588,7 +550,7 @@ public final class InternalWorkbook {
      *  file's list. This will make all
      *  subsequent font indicies drop by one,
      *  so you'll need to update those yourself!
-     * 
+     *
      * @param rec the font record
      */
     public void removeFontRecord(FontRecord rec) {
@@ -614,10 +576,8 @@ public final class InternalWorkbook {
      */
 
     public void setSheetBof(int sheetIndex, int pos) {
-        if (log.check( POILogger.DEBUG )) {
-            log.log(DEBUG, "setting bof for sheetnum =", Integer.valueOf(sheetIndex),
-                " at pos=", Integer.valueOf(pos));
-        }
+        LOG.log(DEBUG, "setting bof for sheetnum =", sheetIndex, " at pos=", pos);
+
         checkSheets(sheetIndex);
         getBoundSheetRec(sheetIndex)
         .setPositionOfBof(pos);
@@ -629,7 +589,7 @@ public final class InternalWorkbook {
 
     /**
      * Returns the position of the backup record.
-     * 
+     *
      * @return the position of the backup record
      */
     public BackupRecord getBackupRecord() {
@@ -645,16 +605,14 @@ public final class InternalWorkbook {
      * @param sheetnum the sheet number (0 based)
      * @param sheetname the name for the sheet
      */
-    public void setSheetName(int sheetnum, String sheetname) {
+    public void setSheetName(int sheetnum, final String sheetname) {
         checkSheets(sheetnum);
 
         // YK: Mimic Excel and silently truncate sheet names longer than 31 characters
-        if(sheetname.length() > 31) {
-            sheetname = sheetname.substring(0, 31);
-        }
+        String sn = (sheetname.length() > 31) ? sheetname.substring(0, 31) : sheetname;
 
         BoundSheetRecord sheet = boundsheets.get(sheetnum);
-        sheet.setSheetname(sheetname);
+        sheet.setSheetname(sn);
     }
 
     /**
@@ -670,9 +628,9 @@ public final class InternalWorkbook {
         if (aName.length() > MAX_SENSITIVE_SHEET_NAME_LEN) {
             aName = aName.substring(0, MAX_SENSITIVE_SHEET_NAME_LEN);
         }
-        for (int i = 0; i < boundsheets.size(); i++) {
-            BoundSheetRecord boundSheetRecord = getBoundSheetRec(i);
-            if (excludeSheetIdx == i) {
+        int i=0;
+        for (BoundSheetRecord boundSheetRecord : boundsheets) {
+            if (excludeSheetIdx == i++) {
                 continue;
             }
             String bName = boundSheetRecord.getSheetname();
@@ -696,7 +654,7 @@ public final class InternalWorkbook {
         int sheetNumber = getSheetIndex(sheetname);
         //remove the sheet that needs to be reordered and place it in the spot we want
         boundsheets.add(pos, boundsheets.remove(sheetNumber));
-        
+
         // also adjust order of Records, calculate the position of the Boundsheets via getBspos()...
         int initialBspos = records.getBspos();
         int pos0 = initialBspos - (boundsheets.size() - 1);
@@ -741,7 +699,7 @@ public final class InternalWorkbook {
     public boolean isSheetVeryHidden(int sheetnum) {
         return getBoundSheetRec(sheetnum).isVeryHidden();
     }
-    
+
     /**
      * Gets the hidden flag for a given sheet.
      * Note that a sheet could instead be
@@ -856,7 +814,7 @@ public final class InternalWorkbook {
                 nr.setSheetNumber(nr.getSheetNumber()-1);
             }
         }
-        
+
         if (linkTable != null) {
             // also tell the LinkTable about the removed sheet
             //index hasn't change in the linktable
@@ -893,9 +851,7 @@ public final class InternalWorkbook {
      */
 
     public int getNumSheets() {
-        if (log.check( POILogger.DEBUG )) {
-            log.log(DEBUG, "getNumSheets=", Integer.valueOf(boundsheets.size()));
-        }
+        LOG.log(DEBUG, "getNumSheets=", boundsheets.size());
         return boundsheets.size();
     }
 
@@ -906,9 +862,7 @@ public final class InternalWorkbook {
      */
 
     public int getNumExFormats() {
-        if (log.check( POILogger.DEBUG )) {
-            log.log(DEBUG, "getXF=", Integer.valueOf(numxfs));
-        }
+        LOG.log(DEBUG, "getXF=", numxfs);
         return numxfs;
     }
 
@@ -934,14 +888,14 @@ public final class InternalWorkbook {
      *  file's list. This will make all
      *  subsequent font indicies drop by one,
      *  so you'll need to update those yourself!
-     * 
+     *
      * @param rec the ExtendedFormatRecord
      */
     public void removeExFormatRecord(ExtendedFormatRecord rec) {
         records.remove(rec); // this updates XfPos for us
         numxfs--;
     }
-    
+
     /**
      * Removes ExtendedFormatRecord record with given index from the
      *  file's list. This will make all
@@ -976,9 +930,9 @@ public final class InternalWorkbook {
      * Returns the StyleRecord for the given
      *  xfIndex, or null if that ExtendedFormat doesn't
      *  have a Style set.
-     *  
+     *
      * @param xfIndex the extended format index
-     * 
+     *
      * @return the StyleRecord, {@code null} if it that ExtendedFormat doesn't have a Style set.
      */
     public StyleRecord getStyleRecord(int xfIndex) {
@@ -986,27 +940,23 @@ public final class InternalWorkbook {
         //  the ExtendedFormat records
         for(int i=records.getXfpos(); i<records.size(); i++) {
             Record r = records.get(i);
-            if(r instanceof ExtendedFormatRecord) {
-                continue;
-            }
-            if(!(r instanceof StyleRecord)) {
-                continue;
-            }
-            StyleRecord sr = (StyleRecord)r;
-            if(sr.getXFIndex() == xfIndex) {
-                return sr;
+            if (r instanceof StyleRecord) {
+                StyleRecord sr = (StyleRecord)r;
+                if (sr.getXFIndex() == xfIndex) {
+                    return sr;
+                }
             }
         }
         return null;
     }
-    
+
     /**
      * Creates a new StyleRecord, for the given Extended
      *  Format index, and adds it onto the end of the
      *  records collection
-     * 
+     *
      * @param xfIndex the extended format index
-     * 
+     *
      * @return a new StyleRecord
      */
     public StyleRecord createStyleRecord(int xfIndex) {
@@ -1046,9 +996,7 @@ public final class InternalWorkbook {
      */
 
     public int addSSTString(UnicodeString string) {
-        if (log.check( POILogger.DEBUG )) {
-            log.log(DEBUG, "insert to sst string='", string);
-        }
+        LOG.log(DEBUG, "insert to sst string='", string);
         if (sst == null) {
             insertSST();
         }
@@ -1066,10 +1014,7 @@ public final class InternalWorkbook {
         }
         UnicodeString retval = sst.getString(str);
 
-        if (log.check( POILogger.DEBUG )) {
-            log.log(DEBUG, "Returning SST for index=", Integer.valueOf(str),
-                " String= ", retval);
-        }
+        LOG.log(DEBUG, "Returning SST for index=", str, " String= ", retval);
         return retval;
     }
 
@@ -1081,42 +1026,13 @@ public final class InternalWorkbook {
      */
 
     public void insertSST() {
-        if (log.check( POILogger.DEBUG )) {
-            log.log(DEBUG, "creating new SST via insertSST!");
-        }
+        LOG.log(DEBUG, "creating new SST via insertSST!");
+
         sst = new SSTRecord();
         records.add(records.size() - 1, createExtendedSST());
         records.add(records.size() - 2, sst);
     }
 
-    /**
-     * Serializes all records int the worksheet section into a big byte array. Use
-     * this to write the Workbook out.
-     *
-     * @return byte array containing the HSSF-only portions of the POIFS file.
-     */
-     // GJS: Not used so why keep it.
-//    public byte [] serialize() {
-//        log.log(DEBUG, "Serializing Workbook!");
-//        byte[] retval    = null;
-//
-////         ArrayList bytes     = new ArrayList(records.size());
-//        int    arraysize = getSize();
-//        int    pos       = 0;
-//
-//        retval = new byte[ arraysize ];
-//        for (int k = 0; k < records.size(); k++) {
-//
-//            Record record = records.get(k);
-////             Let's skip RECALCID records, as they are only use for optimization
-//        if(record.getSid() != RecalcIdRecord.sid || ((RecalcIdRecord)record).isNeeded()) {
-//                pos += record.serialize(pos, retval);   // rec.length;
-//        }
-//        }
-//        log.log(DEBUG, "Exiting serialize workbook");
-//        return retval;
-//    }
-
     /**
      * Serializes all records int the worksheet section into a big byte array. Use
      * this to write the Workbook out.
@@ -1124,49 +1040,37 @@ public final class InternalWorkbook {
      * @param data array of bytes to write this to
      * @return the length of serialized bytes
      */
-    public int serialize( int offset, byte[] data )
-    {
-        if (log.check( POILogger.DEBUG )) {
-            log.log( DEBUG, "Serializing Workbook with offsets" );
-        }
+    public int serialize( int offset, byte[] data ) {
+        LOG.log( DEBUG, "Serializing Workbook with offsets" );
 
         int pos = 0;
 
-        SSTRecord sst = null;
+        SSTRecord lSST = null;
         int sstPos = 0;
         boolean wroteBoundSheets = false;
         for ( Record record : records ) {
-
             int len = 0;
-            if (record instanceof SSTRecord)
-            {
-                sst = (SSTRecord)record;
+            if (record instanceof SSTRecord) {
+                lSST = (SSTRecord)record;
                 sstPos = pos;
             }
-            if (record.getSid() == ExtSSTRecord.sid && sst != null)
-            {
-                record = sst.createExtSSTRecord(sstPos + offset);
+            if (record.getSid() == ExtSSTRecord.sid && lSST != null) {
+                record = lSST.createExtSSTRecord(sstPos + offset);
             }
             if (record instanceof BoundSheetRecord) {
                  if(!wroteBoundSheets) {
-                    for (int i = 0; i < boundsheets.size(); i++) {
-                        len+= getBoundSheetRec(i)
-                                         .serialize(pos+offset+len, data);
+                    for (BoundSheetRecord bsr : boundsheets) {
+                        len += bsr.serialize(pos+offset+len, data);
                     }
                     wroteBoundSheets = true;
                  }
             } else {
                len = record.serialize( pos + offset, data );
             }
-            /////  DEBUG BEGIN /////
-//                if (len != record.getRecordSize())
-//                    throw new IllegalStateException("Record size does not match serialized bytes.  Serialized size = " + len + " but getRecordSize() returns " + record.getRecordSize());
-            /////  DEBUG END /////
-            pos += len;   // rec.length;
-        }
-        if (log.check( POILogger.DEBUG )) {
-            log.log( DEBUG, "Exiting serialize workbook" );
+            pos += len;
         }
+        
+        LOG.log( DEBUG, "Exiting serialize workbook" );
         return pos;
     }
 
@@ -1177,7 +1081,7 @@ public final class InternalWorkbook {
      */
     public void preSerialize(){
         updateEncryptionRecord();
-        
+
         // Ensure we have enough tab IDs
         // Can be a few short if new sheets were added
         if(records.getTabpos() > 0) {
@@ -1189,30 +1093,21 @@ public final class InternalWorkbook {
     }
 
     private void updateEncryptionRecord() {
-        FilePassRecord fpr = null;
-        int fprPos = -1;
-        for (Record r : records.getRecords()) {
-            fprPos++;
-            if (r instanceof FilePassRecord) {
-                fpr = (FilePassRecord)r;
-                break;
-            }
-        }
-        
+        FilePassRecord fpr = (FilePassRecord)findFirstRecordBySid(FilePassRecord.sid);
+
         String password = Biff8EncryptionKey.getCurrentUserPassword();
         if (password == null) {
             if (fpr != null) {
                 // need to remove password data
-                records.remove(fprPos);
+                records.remove(fpr);
             }
-            return;
         } else {
             // create password record
             if (fpr == null) {
                 fpr = new FilePassRecord(EncryptionMode.binaryRC4);
                 records.add(1, fpr);
             }
-            
+
             // check if the password has been changed
             EncryptionInfo ei = fpr.getEncryptionInfo();
             byte encVer[] = ei.getVerifier().getEncryptedVerifier();
@@ -1230,21 +1125,18 @@ public final class InternalWorkbook {
             }
         }
     }
-    
-    public int getSize()
-    {
+
+    public int getSize() {
         int retval = 0;
 
-        SSTRecord sst = null;
-        for ( int k = 0; k < records.size(); k++ )
-        {
-            Record record = records.get( k );
+        SSTRecord lSST = null;
+        for ( Record record : records ) {
             if (record instanceof SSTRecord) {
-                sst = (SSTRecord)record;
+                lSST = (SSTRecord)record;
             }
 
-            if (record.getSid() == ExtSSTRecord.sid && sst != null) {
-                retval += sst.calcExtSSTRecordSize();
+            if (record.getSid() == ExtSSTRecord.sid && lSST != null) {
+                retval += lSST.calcExtSSTRecordSize();
             } else {
                 retval += record.getRecordSize();
             }
@@ -1260,7 +1152,8 @@ public final class InternalWorkbook {
         retval.setType(BOFRecord.TYPE_WORKBOOK);
         retval.setBuild(( short ) 0x10d3);
         retval.setBuildYear(( short ) 1996);
-        retval.setHistoryBitMask(0x41);   // was c1 before verify
+        // was c1 before verify
+        retval.setHistoryBitMask(0x41);
         retval.setRequiredVersion(0x6);
         return retval;
     }
@@ -1290,9 +1183,10 @@ public final class InternalWorkbook {
 
             retval.setUsername(username);
         } catch (AccessControlException e) {
-                // AccessControlException can occur in a restricted context
-                // (client applet/jws application or restricted security server)
-                retval.setUsername(defaultUserName);
+            LOG.log(POILogger.WARN, "can't determine user.name", e);
+            // AccessControlException can occur in a restricted context
+            // (client applet/jws application or restricted security server)
+            retval.setUsername(defaultUserName);
         }
         return retval;
     }
@@ -1471,21 +1365,12 @@ public final class InternalWorkbook {
      *        a file as M$ Excel would create it.)
      */
     private static FormatRecord createFormat(int id) {
-        // we'll need multiple editions for
-        // the different formats
-
-        
-        switch (id) {
-            case 0: return new FormatRecord(5, BuiltinFormats.getBuiltinFormat(5)); 
-            case 1: return new FormatRecord(6, BuiltinFormats.getBuiltinFormat(6)); 
-            case 2: return new FormatRecord(7, BuiltinFormats.getBuiltinFormat(7)); 
-            case 3: return new FormatRecord(8, BuiltinFormats.getBuiltinFormat(8)); 
-            case 4: return new FormatRecord(0x2a, BuiltinFormats.getBuiltinFormat(0x2a)); 
-            case 5: return new FormatRecord(0x29, BuiltinFormats.getBuiltinFormat(0x29)); 
-            case 6: return new FormatRecord(0x2c, BuiltinFormats.getBuiltinFormat(0x2c)); 
-            case 7: return new FormatRecord(0x2b, BuiltinFormats.getBuiltinFormat(0x2b)); 
+        // we'll need multiple editions for the different formats
+        final int mappings[] = { 5, 6, 7, 8, 0x2a, 0x29, 0x2c, 0x2b };
+        if (id < 0 || id >= mappings.length) {
+            throw new  IllegalArgumentException("Unexpected id " + id);
         }
-        throw new  IllegalArgumentException("Unexpected id " + id);
+        return new FormatRecord(mappings[id], BuiltinFormats.getBuiltinFormat(mappings[id]));
     }
 
     /**
@@ -1493,335 +1378,62 @@ public final class InternalWorkbook {
      * @param id    the number of the extended format record to create (meaning its position in
      *        a file as MS Excel would create it.)
      */
-    private static ExtendedFormatRecord createExtendedFormat(int id) {   // we'll need multiple editions
-        ExtendedFormatRecord retval = new ExtendedFormatRecord();
-
+    private static ExtendedFormatRecord createExtendedFormat(int id) {
+        // we'll need multiple editions
         switch (id) {
-
-            case 0 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 1 :
-                retval.setFontIndex(( short ) 1);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 2 :
-                retval.setFontIndex(( short ) 1);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 3 :
-                retval.setFontIndex(( short ) 2);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 4 :
-                retval.setFontIndex(( short ) 2);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 5 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 6 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 7 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 8 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 9 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 10 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 11 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 12 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 13 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 14 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff400);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-                // cell records
-            case 15 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0);
-                retval.setCellOptions(( short ) 0x1);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0x0);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-                // style
-            case 16 :
-                retval.setFontIndex(( short ) 1);
-                retval.setFormatIndex(( short ) 0x2b);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff800);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 17 :
-                retval.setFontIndex(( short ) 1);
-                retval.setFormatIndex(( short ) 0x29);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff800);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 18 :
-                retval.setFontIndex(( short ) 1);
-                retval.setFormatIndex(( short ) 0x2c);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff800);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 19 :
-                retval.setFontIndex(( short ) 1);
-                retval.setFormatIndex(( short ) 0x2a);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff800);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 20 :
-                retval.setFontIndex(( short ) 1);
-                retval.setFormatIndex(( short ) 0x9);
-                retval.setCellOptions(( short ) 0xfffffff5);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0xfffff800);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-                // unused from this point down
-            case 21 :
-                retval.setFontIndex(( short ) 5);
-                retval.setFormatIndex(( short ) 0x0);
-                retval.setCellOptions(( short ) 0x1);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0x800);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 22 :
-                retval.setFontIndex(( short ) 6);
-                retval.setFormatIndex(( short ) 0x0);
-                retval.setCellOptions(( short ) 0x1);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0x5c00);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 23 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0x31);
-                retval.setCellOptions(( short ) 0x1);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0x5c00);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 24 :
-                retval.setFontIndex(( short ) 0);
-                retval.setFormatIndex(( short ) 0x8);
-                retval.setCellOptions(( short ) 0x1);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0x5c00);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            case 25 :
-                retval.setFontIndex(( short ) 6);
-                retval.setFormatIndex(( short ) 0x8);
-                retval.setCellOptions(( short ) 0x1);
-                retval.setAlignmentOptions(( short ) 0x20);
-                retval.setIndentionOptions(( short ) 0x5c00);
-                retval.setBorderOptions(( short ) 0);
-                retval.setPaletteOptions(( short ) 0);
-                retval.setAdtlPaletteOptions(( short ) 0);
-                retval.setFillPaletteOptions(( short ) 0x20c0);
-                break;
-
-            default:
-                throw new IllegalStateException("Unrecognized format id: " + id);
-        }
+            case  0: return createExtendedFormat(0,    0, 0xfffffff5,          0);
+            case  1:
+            case  2: return createExtendedFormat(1,    0, 0xfffffff5, 0xfffff400);
+            case  3:
+            case  4: return createExtendedFormat(2,    0, 0xfffffff5, 0xfffff400);
+            case  5:
+            case  6:
+            case  7:
+            case  8:
+            case  9:
+            case 10:
+            case 11:
+            case 12:
+            case 13:
+            case 14: return createExtendedFormat(0,    0, 0xfffffff5, 0xfffff400);
+            // cell records
+            case 15: return createExtendedFormat(0,    0,          1,          0);
+            // style
+            case 16: return createExtendedFormat(1, 0x2b, 0xfffffff5, 0xfffff800);
+            case 17: return createExtendedFormat(1, 0x29, 0xfffffff5, 0xfffff800);
+            case 18: return createExtendedFormat(1, 0x2c, 0xfffffff5, 0xfffff800);
+            case 19: return createExtendedFormat(1, 0x2a, 0xfffffff5, 0xfffff800);
+            case 20: return createExtendedFormat(1, 0x09, 0xfffffff5, 0xfffff800);
+            // unused from this point down
+            case 21: return createExtendedFormat(5,    0,          1,      0x800);
+            case 22: return createExtendedFormat(6,    0,          1,     0x5c00);
+            case 23: return createExtendedFormat(0, 0x31,          1,     0x5c00);
+            case 24: return createExtendedFormat(0,    8,          1,     0x5c00);
+            case 25: return createExtendedFormat(6,    8,          1,     0x5c00);
+
+            default: throw new IllegalStateException("Unrecognized format id: " + id);
+        }
+    }
+
+    private static ExtendedFormatRecord createExtendedFormat(
+        int fontIndex, int formatIndex, int cellOptions, int indentionOptions
+    ) {
+        ExtendedFormatRecord retval = new ExtendedFormatRecord();
+        retval.setFontIndex(( short ) fontIndex);
+        retval.setFormatIndex(( short ) formatIndex);
+        retval.setCellOptions(( short ) cellOptions);
+        retval.setAlignmentOptions(( short ) 0x20);
+        retval.setIndentionOptions(( short ) indentionOptions);
+        retval.setBorderOptions(( short ) 0);
+        retval.setPaletteOptions(( short ) 0);
+        retval.setAdtlPaletteOptions(( short ) 0);
+        retval.setFillPaletteOptions(( short ) 0x20c0);
         return retval;
     }
 
     /**
      * creates an default cell type ExtendedFormatRecord object.
-     * @return ExtendedFormatRecord with intial defaults (cell-type)
+     * @return ExtendedFormatRecord with initial defaults (cell-type)
      */
     private static ExtendedFormatRecord createExtendedFormat() {
         ExtendedFormatRecord retval = new ExtendedFormatRecord();
@@ -1847,50 +1459,19 @@ public final class InternalWorkbook {
      * @param id        the number of the style record to create (meaning its position in
      *                  a file as MS Excel would create it.
      */
-    private static StyleRecord createStyle(int id) {   // we'll need multiple editions
-        StyleRecord retval = new StyleRecord();
-
-        switch (id) {
-
-            case 0 :
-                retval.setXFIndex(0x010);
-                retval.setBuiltinStyle(3);
-                retval.setOutlineStyleLevel(( byte ) 0xffffffff);
-                break;
-
-            case 1 :
-                retval.setXFIndex(0x011);
-                retval.setBuiltinStyle(6);
-                retval.setOutlineStyleLevel(( byte ) 0xffffffff);
-                break;
-
-            case 2 :
-                retval.setXFIndex(0x012);
-                retval.setBuiltinStyle(4);
-                retval.setOutlineStyleLevel(( byte ) 0xffffffff);
-                break;
-
-            case 3 :
-                retval.setXFIndex(0x013);
-                retval.setBuiltinStyle(7);
-                retval.setOutlineStyleLevel(( byte ) 0xffffffff);
-                break;
-
-            case 4 :
-                retval.setXFIndex(0x000);
-                retval.setBuiltinStyle(0);
-                retval.setOutlineStyleLevel(( byte ) 0xffffffff);
-                break;
-
-            case 5 :
-                retval.setXFIndex(0x014);
-                retval.setBuiltinStyle(5);
-                retval.setOutlineStyleLevel(( byte ) 0xffffffff);
-                break;
-
-            default:
-                throw new IllegalStateException("Unrecognized style id: " + id);
+    private static StyleRecord createStyle(int id) {
+        // we'll need multiple editions
+        final int mappings[][] = {
+            { 0x010, 3 }, { 0x011, 6 }, { 0x012, 4 }, { 0x013, 7 }, { 0x000, 0 }, { 0x014, 5 }  
+        };
+        if (id < 0 || id >= mappings.length) {
+            throw new  IllegalArgumentException("Unexpected style id " + id);
         }
+
+        StyleRecord retval = new StyleRecord();
+        retval.setOutlineStyleLevel(( byte ) 0xffffffff);
+        retval.setXFIndex(mappings[id][0]);
+        retval.setBuiltinStyle(mappings[id][1]);
         return retval;
     }
 
@@ -1930,10 +1511,9 @@ public final class InternalWorkbook {
         retval.setDefaultCountry(( short ) 1);
 
         // from Russia with love ;)
-        if ( LocaleUtil.getUserLocale().toString().equals( "ru_RU" ) ) {
+        if ( "ru_RU".equals( LocaleUtil.getUserLocale().toString() ) ) {
             retval.setCurrentCountry(( short ) 7);
-        }
-        else {
+        } else {
             retval.setCurrentCountry(( short ) 1);
         }
 
@@ -1961,12 +1541,12 @@ public final class InternalWorkbook {
         }
         return linkTable;
     }
-    
+
     public int linkExternalWorkbook(String name, Workbook externalWorkbook) {
         return getOrCreateLinkTable().linkExternalWorkbook(name, externalWorkbook);
     }
 
-    /** 
+    /**
      * Finds the first sheet name by his extern sheet index
      * @param externSheetIndex extern sheet index
      * @return first sheet name.
@@ -1991,7 +1571,7 @@ public final class InternalWorkbook {
         }
         return getSheetName(internalSheetIndex);
     }
-    
+
     public ExternalSheet getExternalSheet(int externSheetIndex) {
         String[] extNames = linkTable.getExternalBookAndSheetName(externSheetIndex);
         if (extNames == null) {
@@ -2033,7 +1613,7 @@ public final class InternalWorkbook {
         return linkTable.getLastInternalSheetIndexForExtIndex(externSheetNumber);
     }
 
-    /** 
+    /**
      * Returns the extern sheet number for specific sheet number.
      * If this sheet doesn't exist in extern sheet, add it
      * @param sheetNumber local sheet number
@@ -2042,7 +1622,7 @@ public final class InternalWorkbook {
     public short checkExternSheet(int sheetNumber){
         return (short)getOrCreateLinkTable().checkExternSheet(sheetNumber);
     }
-    /** 
+    /**
      * Returns the extern sheet number for specific range of sheets.
      * If this sheet range doesn't exist in extern sheet, add it
      * @param firstSheetNumber first local sheet number
@@ -2100,25 +1680,21 @@ public final class InternalWorkbook {
 
     /**
      * adds a name record
-     * 
+     *
      * @param name the name record to be added
-     * @return the given name record 
+     * @return the given name record
      */
-    public NameRecord addName(NameRecord name)
-    {
-
-        LinkTable linkTable = getOrCreateLinkTable();
-        linkTable.addName(name);
-
+    public NameRecord addName(NameRecord name) {
+        getOrCreateLinkTable().addName(name);
         return name;
     }
 
     /**
      * Generates a NameRecord to represent a built-in region
-     * 
+     *
      * @param builtInName the built-in name
      * @param sheetNumber the sheet number
-     * 
+     *
      * @return a new NameRecord
      */
     public NameRecord createBuiltInName(byte builtInName, int sheetNumber) {
@@ -2152,7 +1728,7 @@ public final class InternalWorkbook {
     /**
      * If a {@link NameCommentRecord} is added or the name it references
      *  is renamed, then this will update the lookup cache for it.
-     * 
+     *
      * @param commentRecord the comment record
      */
     public void updateNameCommentRecordCache(final NameCommentRecord commentRecord) {
@@ -2221,9 +1797,9 @@ public final class InternalWorkbook {
 
     /**
      * Returns the first occurance of a record matching a particular sid.
-     * 
+     *
      * @param sid the sid
-     * 
+     *
      * @return the matching record or {@code null} if it wasn't found
      */
     public Record findFirstRecordBySid(short sid) {
@@ -2253,19 +1829,17 @@ public final class InternalWorkbook {
 
     /**
      * Returns the next occurance of a record matching a particular sid.
-     * 
+     *
      * @param sid the sid
      * @param pos specifies the n-th matching sid
-     * 
+     *
      * @return the matching record or {@code null} if it wasn't found
      */
     public Record findNextRecordBySid(short sid, int pos) {
         int matches = 0;
         for (Record record : records) {
-            if (record.getSid() == sid) {
-                if (matches++ == pos) {
-                    return record;
-                }
+            if (record.getSid() == sid && matches++ == pos) {
+                return record;
             }
         }
         return null;
@@ -2293,34 +1867,31 @@ public final class InternalWorkbook {
     /**
      * Returns the custom palette in use for this workbook; if a custom palette record
      * does not exist, then it is created.
-     * 
+     *
      * @return the custom palette
      */
-    public PaletteRecord getCustomPalette()
-    {
-      PaletteRecord palette;
-      int palettePos = records.getPalettepos();
-      if (palettePos != -1) {
-        Record rec = records.get(palettePos);
-        if (rec instanceof PaletteRecord) {
-          palette = (PaletteRecord) rec;
+    public PaletteRecord getCustomPalette() {
+        PaletteRecord palette;
+        int palettePos = records.getPalettepos();
+        if (palettePos != -1) {
+            Record rec = records.get(palettePos);
+            if (rec instanceof PaletteRecord) {
+                palette = (PaletteRecord) rec;
+            } else {
+                throw new RuntimeException("InternalError: Expected PaletteRecord but got a '"+rec+"'");
+            }
         } else {
-            throw new RuntimeException("InternalError: Expected PaletteRecord but got a '"+rec+"'");
+            palette = createPalette();
+            //Add the palette record after the bof which is always the first record
+            records.add(1, palette);
+            records.setPalettepos(1);
         }
-      }
-      else
-      {
-          palette = createPalette();
-          //Add the palette record after the bof which is always the first record
-          records.add(1, palette);
-          records.setPalettepos(1);
-      }
-      return palette;
+        return palette;
     }
 
     /**
      * Finds the primary drawing group, if one already exists
-     * 
+     *
      * @return the primary drawing group
      */
     public DrawingManager2 findDrawingGroup() {
@@ -2328,72 +1899,60 @@ public final class InternalWorkbook {
            // We already have it!
            return drawingManager;
         }
-        
-        // Need to find a DrawingGroupRecord that
-        //  contains a EscherDggRecord
-        for(Record r : records) {
-            if(r instanceof DrawingGroupRecord) {
-                DrawingGroupRecord dg = (DrawingGroupRecord)r;
-                dg.processChildRecords();
-
-                EscherContainerRecord cr =
-                    dg.getEscherContainer();
-                if(cr == null) {
-                    continue;
-                }
-
-                EscherDggRecord dgg = null;
-                EscherContainerRecord bStore = null;
-                for(EscherRecord er : cr) {
-                    if(er instanceof EscherDggRecord) {
-                        dgg = (EscherDggRecord)er;
-                    } else if (er.getRecordId() == EscherContainerRecord.BSTORE_CONTAINER) {
-                        bStore = (EscherContainerRecord) er;
-                    }
-                }
 
-                if(dgg != null) {
-                    drawingManager = new DrawingManager2(dgg);
-                    if(bStore != null){
-                        for(EscherRecord bs : bStore.getChildRecords()){
-                            if(bs instanceof EscherBSERecord) {
-                                escherBSERecords.add((EscherBSERecord)bs);
-                            }
-                        }
-                    }
-                    return drawingManager;
-                }
+        // Need to find a DrawingGroupRecord that contains a EscherDggRecord
+        for(Record r : records) {
+            if (!(r instanceof DrawingGroupRecord)) {
+                continue;
+            }
+            DrawingGroupRecord dg = (DrawingGroupRecord)r;
+            dg.processChildRecords();
+            drawingManager = findDrawingManager(dg, escherBSERecords);
+            if (drawingManager != null) {
+                return drawingManager;
             }
         }
 
+        // TODO: we've already scanned the records, why should this work any better now?
         // Look for the DrawingGroup record
-        int dgLoc = findFirstRecordLocBySid(DrawingGroupRecord.sid);
-
+        DrawingGroupRecord dg = (DrawingGroupRecord)findFirstRecordBySid(DrawingGroupRecord.sid);
+        drawingManager = findDrawingManager(dg, escherBSERecords);
+        return drawingManager;
+    }
+    
+    private static DrawingManager2 findDrawingManager(DrawingGroupRecord dg, List<EscherBSERecord> escherBSERecords) {
+        if (dg == null) {
+            return null;
+        }
         // If there is one, does it have a EscherDggRecord?
-        if(dgLoc != -1) {
-            DrawingGroupRecord dg = (DrawingGroupRecord)records.get(dgLoc);
-            EscherDggRecord dgg = null;
-            EscherContainerRecord bStore = null;
-            for(EscherRecord er : dg.getEscherRecords()) {
-                if (er instanceof EscherDggRecord) {
-                    dgg = (EscherDggRecord) er;
-                } else if (er.getRecordId() == EscherContainerRecord.BSTORE_CONTAINER) {
-                    bStore = (EscherContainerRecord) er;
-                }
+        EscherContainerRecord cr = dg.getEscherContainer();
+        if (cr == null) {
+            return null;
+        }
+
+        EscherDggRecord dgg = null;
+        EscherContainerRecord bStore = null;
+        for(EscherRecord er : cr) {
+            if (er instanceof EscherDggRecord) {
+                dgg = (EscherDggRecord) er;
+            } else if (er.getRecordId() == EscherContainerRecord.BSTORE_CONTAINER) {
+                bStore = (EscherContainerRecord) er;
             }
+        }
 
-            if(dgg != null) {
-                drawingManager = new DrawingManager2(dgg);
-                if(bStore != null){
-                    for(EscherRecord bs : bStore.getChildRecords()){
-                        if(bs instanceof EscherBSERecord) {
-                            escherBSERecords.add((EscherBSERecord)bs);
-                        }
-                    }
+        if(dgg == null) {
+            return null;
+        }
+            
+        DrawingManager2 dm = new DrawingManager2(dgg);
+        if(bStore != null){
+            for(EscherRecord bs : bStore.getChildRecords()){
+                if(bs instanceof EscherBSERecord) {
+                    escherBSERecords.add((EscherBSERecord)bs);
                 }
             }
         }
-        return drawingManager;
+        return dm;
     }
 
     /**
@@ -2417,7 +1976,7 @@ public final class InternalWorkbook {
             dgg.setFileIdClusters(new EscherDggRecord.FileIdCluster[] {} );
             drawingManager = new DrawingManager2(dgg);
             EscherContainerRecord bstoreContainer = null;
-            if (escherBSERecords.size() > 0)
+            if (!escherBSERecords.isEmpty())
             {
                 bstoreContainer = new EscherContainerRecord();
                 bstoreContainer.setRecordId( EscherContainerRecord.BSTORE_CONTAINER );
@@ -2483,9 +2042,7 @@ public final class InternalWorkbook {
         if (dggContainer.getChild( 1 ).getRecordId() == EscherContainerRecord.BSTORE_CONTAINER )
         {
             bstoreContainer = (EscherContainerRecord) dggContainer.getChild( 1 );
-        }
-        else
-        {
+        } else {
             bstoreContainer = new EscherContainerRecord();
             bstoreContainer.setRecordId( EscherContainerRecord.BSTORE_CONTAINER );
             List<EscherRecord> childRecords = dggContainer.getChildRecords();
@@ -2507,11 +2064,7 @@ public final class InternalWorkbook {
     public WriteProtectRecord getWriteProtect() {
         if (writeProtect == null) {
            writeProtect = new WriteProtectRecord();
-           int i = 0;
-           for (i = 0;
-                i < records.size() && !(records.get(i) instanceof BOFRecord);
-                i++) {
-           }
+           int i = findFirstRecordLocBySid(BOFRecord.sid);
            records.add(i+1, writeProtect);
         }
         return this.writeProtect;
@@ -2520,11 +2073,7 @@ public final class InternalWorkbook {
     public WriteAccessRecord getWriteAccess() {
         if (writeAccess == null) {
            writeAccess = createWriteAccess();
-           int i = 0;
-           for (i = 0;
-                i < records.size() && !(records.get(i) instanceof InterfaceEndRecord);
-                i++) {
-           }
+           int i = findFirstRecordLocBySid(InterfaceEndRecord.sid);
            records.add(i+1, writeAccess);
         }
         return writeAccess;
@@ -2533,11 +2082,7 @@ public final class InternalWorkbook {
     public FileSharingRecord getFileSharing() {
         if (fileShare == null) {
            fileShare = new FileSharingRecord();
-           int i = 0;
-           for (i = 0;
-                i < records.size() && !(records.get(i) instanceof WriteAccessRecord);
-                i++) {
-           }
+           int i = findFirstRecordLocBySid(WriteAccessRecord.sid);
            records.add(i+1, fileShare);
         }
         return fileShare;
@@ -2545,7 +2090,7 @@ public final class InternalWorkbook {
 
     /**
      * is the workbook protected with a password (not encrypted)?
-     * 
+     *
      * @return {@code true} if the workbook is write protected
      */
     public boolean isWriteProtected() {
@@ -2559,7 +2104,7 @@ public final class InternalWorkbook {
     /**
      * protect a workbook with a password (not encypted, just sets writeprotect
      * flags and the password.
-     * 
+     *
      * @param password the password
      * @param username the username
      */
@@ -2631,61 +2176,61 @@ public final class InternalWorkbook {
 
         //check if the cloned sheet has drawings
         int aggLoc = sheet.aggregateDrawingRecords(drawingManager, false);
-        if(aggLoc != -1) {
-            EscherAggregate agg = (EscherAggregate) sheet.findFirstRecordBySid(EscherAggregate.sid);
-            EscherContainerRecord escherContainer = agg.getEscherContainer();
-            if (escherContainer == null) {
-                return;
-            }
-
-            EscherDggRecord dgg = drawingManager.getDgg();
-
-            //register a new drawing group for the cloned sheet
-            int dgId = drawingManager.findNewDrawingGroupId();
-            dgg.addCluster( dgId, 0 );
-            dgg.setDrawingsSaved(dgg.getDrawingsSaved() + 1);
-
-            EscherDgRecord dg = null;
-            for(EscherRecord er : escherContainer) {
-                if(er instanceof EscherDgRecord) {
-                    dg = (EscherDgRecord)er;
-                    //update id of the drawing in the cloned sheet
-                    dg.setOptions( (short) ( dgId << 4 ) );
-                } else if (er instanceof EscherContainerRecord){
-                    // iterate over shapes and re-generate shapeId
-                    EscherContainerRecord cp = (EscherContainerRecord)er;
-                    for(Iterator<EscherRecord> spIt = cp.getChildRecords().iterator(); spIt.hasNext();) {
-                        EscherContainerRecord shapeContainer = (EscherContainerRecord)spIt.next();
-                        for(EscherRecord shapeChildRecord : shapeContainer.getChildRecords()) {
-                            int recordId = shapeChildRecord.getRecordId();
-                            if (recordId == EscherSpRecord.RECORD_ID){
-                                if (dg == null) {
-                                    throw new RecordFormatException("EscherDgRecord wasn't set/processed before.");
-                                }
-                                EscherSpRecord sp = (EscherSpRecord)shapeChildRecord;
-                                int shapeId = drawingManager.allocateShapeId((short)dgId, dg);
-                                //allocateShapeId increments the number of shapes. roll back to the previous value
-                                dg.setNumShapes(dg.getNumShapes()-1);
-                                sp.setShapeId(shapeId);
-                            } else if (recordId == EscherOptRecord.RECORD_ID){
-                                EscherOptRecord opt = (EscherOptRecord)shapeChildRecord;
-                                EscherSimpleProperty prop = (EscherSimpleProperty)opt.lookup(
-                                        EscherProperties.BLIP__BLIPTODISPLAY );
-                                if (prop != null){
-                                    int pictureIndex = prop.getPropertyValue();
-                                    // increment reference count for pictures
-                                    EscherBSERecord bse = getBSERecord(pictureIndex);
-                                    bse.setRef(bse.getRef() + 1);
-                                }
+        if(aggLoc == -1) {
+            return;
+        }
+        
+        EscherAggregate agg = (EscherAggregate) sheet.findFirstRecordBySid(EscherAggregate.sid);
+        EscherContainerRecord escherContainer = agg.getEscherContainer();
+        if (escherContainer == null) {
+            return;
+        }
 
+        EscherDggRecord dgg = drawingManager.getDgg();
+
+        //register a new drawing group for the cloned sheet
+        int dgId = drawingManager.findNewDrawingGroupId();
+        dgg.addCluster( dgId, 0 );
+        dgg.setDrawingsSaved(dgg.getDrawingsSaved() + 1);
+
+        EscherDgRecord dg = null;
+        for(EscherRecord er : escherContainer) {
+            if(er instanceof EscherDgRecord) {
+                dg = (EscherDgRecord)er;
+                //update id of the drawing in the cloned sheet
+                dg.setOptions( (short) ( dgId << 4 ) );
+            } else if (er instanceof EscherContainerRecord){
+                // iterate over shapes and re-generate shapeId
+                for(EscherRecord er2 : (EscherContainerRecord)er) {
+                    for(EscherRecord shapeChildRecord : (EscherContainerRecord)er2) {
+                        int recordId = shapeChildRecord.getRecordId();
+                        if (recordId == EscherSpRecord.RECORD_ID){
+                            if (dg == null) {
+                                throw new RecordFormatException("EscherDgRecord wasn't set/processed before.");
+                            }
+                            EscherSpRecord sp = (EscherSpRecord)shapeChildRecord;
+                            int shapeId = drawingManager.allocateShapeId((short)dgId, dg);
+                            //allocateShapeId increments the number of shapes. roll back to the previous value
+                            dg.setNumShapes(dg.getNumShapes()-1);
+                            sp.setShapeId(shapeId);
+                        } else if (recordId == EscherOptRecord.RECORD_ID){
+                            EscherOptRecord opt = (EscherOptRecord)shapeChildRecord;
+                            EscherSimpleProperty prop = (EscherSimpleProperty)opt.lookup(
+                                    EscherProperties.BLIP__BLIPTODISPLAY );
+                            if (prop != null){
+                                int pictureIndex = prop.getPropertyValue();
+                                // increment reference count for pictures
+                                EscherBSERecord bse = getBSERecord(pictureIndex);
+                                bse.setRef(bse.getRef() + 1);
                             }
+
                         }
                     }
                 }
             }
         }
     }
-    
+
     public NameRecord cloneFilter(int filterDbNameIndex, int newSheetIndex){
         NameRecord origNameRecord = getNameRecord(filterDbNameIndex);
         // copy original formula but adjust 3D refs to the new external sheet index
@@ -2712,7 +2257,7 @@ public final class InternalWorkbook {
     }
     /**
      * Updates named ranges due to moving of cells
-     * 
+     *
      * @param shifter the formula shifter
      */
     public void updateNamesAfterCellShift(FormulaShifter shifter) {
@@ -2743,10 +2288,10 @@ public final class InternalWorkbook {
         return record;
     }
 
-        
+
        /**
         * Changes an external referenced file to another file.
-        * A formular in Excel which refers a cell in another file is saved in two parts: 
+        * A formular in Excel which refers a cell in another file is saved in two parts:
         * The referenced file is stored in an reference table. the row/cell information is saved separate.
         * This method invokation will only change the reference in the lookup-table itself.
         * @param oldUrl The old URL to search for and which is to be replaced
@@ -2756,4 +2301,4 @@ public final class InternalWorkbook {
     public boolean changeExternalReference(String oldUrl, String newUrl) {
        return linkTable.changeExternalReference(oldUrl, newUrl);
     }
-}
+}
\ No newline at end of file
index 1a6d8b8f4048512dceb326585cc990be2fbf9196..bfacb4b19ab7e54662d639064b7c14a53297202e 100644 (file)
@@ -19,11 +19,15 @@ package org.apache.poi.hwpf.converter;
 import static org.apache.poi.hwpf.converter.AbstractWordUtils.TWIPS_PER_INCH;
 
 import java.io.File;
+import java.io.IOException;
+import java.util.Deque;
+import java.util.LinkedList;
 import java.util.List;
-import java.util.Stack;
 
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
@@ -56,8 +60,6 @@ import org.w3c.dom.Text;
  * This implementation doesn't create images or links to them. This can be
  * changed by overriding {@link #processImage(Element, boolean, Picture)}
  * method.
- * 
- * @author Sergey Vladimirov (vlsergey {at} gmail {dot} com)
  */
 @Beta
 public class WordToHtmlConverter extends AbstractWordConverter
@@ -78,9 +80,27 @@ public class WordToHtmlConverter extends AbstractWordConverter
         }
     }
 
-    private static final POILogger logger = POILogFactory
-            .getLogger( WordToHtmlConverter.class );
+    private static final POILogger logger = POILogFactory.getLogger( WordToHtmlConverter.class );
 
+    private final Deque<BlockProperies> blocksProperies = new LinkedList<BlockProperies>();
+
+    private final HtmlDocumentFacade htmlDocumentFacade;
+
+    private Element notes;
+
+    /**
+     * Creates new instance of {@link WordToHtmlConverter}. Can be used for
+     * output several {@link HWPFDocument}s into single HTML document.
+     * 
+     * @param document XML DOM Document used as HTML document
+     */
+    public WordToHtmlConverter( Document document ) {
+        this.htmlDocumentFacade = new HtmlDocumentFacade( document );
+    }
+
+    public WordToHtmlConverter( HtmlDocumentFacade htmlDocumentFacade ) {
+        this.htmlDocumentFacade = htmlDocumentFacade;
+    }
     
     private static String getSectionStyle( Section section )
     {
@@ -110,20 +130,17 @@ public class WordToHtmlConverter extends AbstractWordConverter
     }
 
     /**
-     * Java main() interface to interact with {@link WordToHtmlConverter}
+     * Java main() interface to interact with {@link WordToHtmlConverter}<p>
+     * 
+     * Usage: WordToHtmlConverter infile outfile<p>
      * 
-     * <p>
-     * Usage: WordToHtmlConverter infile outfile
-     * </p>
      * Where infile is an input .doc file ( Word 95-2007) which will be rendered
      * as HTML into outfile
      */
-    public static void main( String[] args ) throws Exception
-    {
-        if ( args.length < 2 )
-        {
-            System.err
-                    .println( "Usage: WordToHtmlConverter <inputFile.doc> <saveTo.html>" );
+    public static void main( String[] args )
+    throws IOException, ParserConfigurationException, TransformerException {
+        if ( args.length < 2 ) {
+            System.err.println( "Usage: WordToHtmlConverter <inputFile.doc> <saveTo.html>" );
             return;
         }
 
@@ -144,9 +161,9 @@ public class WordToHtmlConverter extends AbstractWordConverter
         serializer.transform( domSource, streamResult );
     }
 
-    static Document process( File docFile ) throws Exception
+    static Document process( File docFile ) throws IOException, ParserConfigurationException
     {
-        final HWPFDocumentCore wordDocument = WordToHtmlUtils.loadDoc( docFile );
+        final HWPFDocumentCore wordDocument = AbstractWordUtils.loadDoc( docFile );
         WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
                 XMLHelper.getDocumentBuilderFactory().newDocumentBuilder()
                         .newDocument() );
@@ -154,38 +171,17 @@ public class WordToHtmlConverter extends AbstractWordConverter
         return wordToHtmlConverter.getDocument();
     }
 
-    private final Stack<BlockProperies> blocksProperies = new Stack<BlockProperies>();
-
-    private final HtmlDocumentFacade htmlDocumentFacade;
-
-    private Element notes;
-
-    /**
-     * Creates new instance of {@link WordToHtmlConverter}. Can be used for
-     * output several {@link HWPFDocument}s into single HTML document.
-     * 
-     * @param document
-     *            XML DOM Document used as HTML document
-     */
-    public WordToHtmlConverter( Document document )
-    {
-        this.htmlDocumentFacade = new HtmlDocumentFacade( document );
-    }
-
-    public WordToHtmlConverter( HtmlDocumentFacade htmlDocumentFacade )
-    {
-        this.htmlDocumentFacade = htmlDocumentFacade;
-    }
-
     @Override
     protected void afterProcess()
     {
-        if ( notes != null )
+        if ( notes != null ) {
             htmlDocumentFacade.getBody().appendChild( notes );
+        }
 
         htmlDocumentFacade.updateStylesheet();
     }
 
+    @Override
     public Document getDocument()
     {
         return htmlDocumentFacade.getDocument();
@@ -202,8 +198,8 @@ public class WordToHtmlConverter extends AbstractWordConverter
         BlockProperies blockProperies = this.blocksProperies.peek();
         Triplet triplet = getCharacterRunTriplet( characterRun );
 
-        if ( WordToHtmlUtils.isNotEmpty( triplet.fontName )
-                && !WordToHtmlUtils.equals( triplet.fontName,
+        if ( AbstractWordUtils.isNotEmpty( triplet.fontName )
+                && !AbstractWordUtils.equals( triplet.fontName,
                         blockProperies.pFontName ) )
         {
             style.append( "font-family:" + triplet.fontName + ";" );
@@ -222,8 +218,9 @@ public class WordToHtmlConverter extends AbstractWordConverter
         }
 
         WordToHtmlUtils.addCharactersProperties( characterRun, style );
-        if ( style.length() != 0 )
+        if ( style.length() != 0 ) {
             htmlDocumentFacade.addStyleClass( span, "s", style.toString() );
+        }
 
         Text textNode = htmlDocumentFacade.createText( text );
         span.appendChild( textNode );
@@ -243,26 +240,31 @@ public class WordToHtmlConverter extends AbstractWordConverter
             parent = bookmarkElement;
         }
 
-        if ( range != null )
+        if ( range != null ) {
             processCharacters( wordDocument, currentTableLevel, range, parent );
+        }
     }
 
     @Override
     protected void processDocumentInformation(
             SummaryInformation summaryInformation )
     {
-        if ( WordToHtmlUtils.isNotEmpty( summaryInformation.getTitle() ) )
+        if ( AbstractWordUtils.isNotEmpty( summaryInformation.getTitle() ) ) {
             htmlDocumentFacade.setTitle( summaryInformation.getTitle() );
+        }
 
-        if ( WordToHtmlUtils.isNotEmpty( summaryInformation.getAuthor() ) )
+        if ( AbstractWordUtils.isNotEmpty( summaryInformation.getAuthor() ) ) {
             htmlDocumentFacade.addAuthor( summaryInformation.getAuthor() );
+        }
 
-        if ( WordToHtmlUtils.isNotEmpty( summaryInformation.getKeywords() ) )
+        if ( AbstractWordUtils.isNotEmpty( summaryInformation.getKeywords() ) ) {
             htmlDocumentFacade.addKeywords( summaryInformation.getKeywords() );
+        }
 
-        if ( WordToHtmlUtils.isNotEmpty( summaryInformation.getComments() ) )
+        if ( AbstractWordUtils.isNotEmpty( summaryInformation.getComments() ) ) {
             htmlDocumentFacade
                     .addDescription( summaryInformation.getComments() );
+        }
     }
 
     @Override
@@ -318,11 +320,13 @@ public class WordToHtmlConverter extends AbstractWordConverter
         Element basicLink = htmlDocumentFacade.createHyperlink( hyperlink );
         currentBlock.appendChild( basicLink );
 
-        if ( textRange != null )
+        if ( textRange != null ) {
             processCharacters( wordDocument, currentTableLevel, textRange,
                     basicLink );
+        }
     }
 
+    @Override
     protected void processImage( Element currentBlock, boolean inlined,
             Picture picture, String imageSourcePath )
     {
@@ -372,7 +376,7 @@ public class WordToHtmlConverter extends AbstractWordConverter
         }
 
         Element root;
-        if ( cropTop != 0 || cropRight != 0 || cropBottom != 0 || cropLeft != 0 )
+        if ( Math.abs(cropTop)+Math.abs(cropRight)+Math.abs(cropBottom)+Math.abs(cropLeft) > 0 )
         {
             float visibleWidth = Math
                     .max( 0, imageWidth - cropLeft - cropRight );
@@ -482,6 +486,7 @@ public class WordToHtmlConverter extends AbstractWordConverter
         flow.appendChild( htmlDocumentFacade.createLineBreak() );
     }
 
+    @Override
     protected void processPageref( HWPFDocumentCore hwpfDocument,
             Element currentBlock, Range textRange, int currentTableLevel,
             String pageref )
@@ -489,11 +494,13 @@ public class WordToHtmlConverter extends AbstractWordConverter
         Element basicLink = htmlDocumentFacade.createHyperlink( "#" + pageref );
         currentBlock.appendChild( basicLink );
 
-        if ( textRange != null )
+        if ( textRange != null ) {
             processCharacters( hwpfDocument, currentTableLevel, textRange,
                     basicLink );
+        }
     }
 
+    @Override
     protected void processParagraph( HWPFDocumentCore hwpfDocument,
             Element parentElement, int currentTableLevel, Paragraph paragraph,
             String bulletText )
@@ -526,13 +533,13 @@ public class WordToHtmlConverter extends AbstractWordConverter
             else
             {
                 pFontSize = -1;
-                pFontName = WordToHtmlUtils.EMPTY;
+                pFontName = AbstractWordUtils.EMPTY;
             }
             blocksProperies.push( new BlockProperies( pFontName, pFontSize ) );
         }
         try
         {
-            if ( WordToHtmlUtils.isNotEmpty( bulletText ) )
+            if ( AbstractWordUtils.isNotEmpty( bulletText ) )
             {
                 if ( bulletText.endsWith( "\t" ) )
                 {
@@ -581,13 +588,15 @@ public class WordToHtmlConverter extends AbstractWordConverter
             blocksProperies.pop();
         }
 
-        if ( style.length() > 0 )
+        if ( style.length() > 0 ) {
             htmlDocumentFacade.addStyleClass( pElement, "p", style.toString() );
+        }
 
         WordToHtmlUtils.compactSpans( pElement );
         return;
     }
 
+    @Override
     protected void processSection( HWPFDocumentCore wordDocument,
             Section section, int sectionCounter )
     {
@@ -609,13 +618,14 @@ public class WordToHtmlConverter extends AbstractWordConverter
                 Integer.MIN_VALUE );
     }
 
+    @Override
     protected void processTable( HWPFDocumentCore hwpfDocument, Element flow,
             Table table )
     {
         Element tableHeader = htmlDocumentFacade.createTableHeader();
         Element tableBody = htmlDocumentFacade.createTableBody();
 
-        final int[] tableCellEdges = WordToHtmlUtils
+        final int[] tableCellEdges = AbstractWordUtils
                 .buildTableCellEdgesArray( table );
         final int tableRows = table.numRows();
 
@@ -667,18 +677,21 @@ public class WordToHtmlConverter extends AbstractWordConverter
                         currentEdgeIndex, tableCell );
                 currentEdgeIndex += colSpan;
 
-                if ( colSpan == 0 )
+                if ( colSpan == 0 ) {
                     continue;
+                }
 
-                if ( colSpan != 1 )
+                if ( colSpan != 1 ) {
                     tableCellElement.setAttribute( "colspan",
                             String.valueOf( colSpan ) );
+                }
 
                 final int rowSpan = getNumberRowsSpanned( table,
                         tableCellEdges, r, c, tableCell );
-                if ( rowSpan > 1 )
+                if ( rowSpan > 1 ) {
                     tableCellElement.setAttribute( "rowspan",
                             String.valueOf( rowSpan ) );
+                }
 
                 processParagraphes( hwpfDocument, tableCellElement, tableCell,
                         table.getTableLevel() );
@@ -688,17 +701,19 @@ public class WordToHtmlConverter extends AbstractWordConverter
                     tableCellElement.appendChild( htmlDocumentFacade
                             .createParagraph() );
                 }
-                if ( tableCellStyle.length() > 0 )
+                if ( tableCellStyle.length() > 0 ) {
                     htmlDocumentFacade.addStyleClass( tableCellElement,
                             tableCellElement.getTagName(),
                             tableCellStyle.toString() );
+                }
 
                 tableRowElement.appendChild( tableCellElement );
             }
 
-            if ( tableRowStyle.length() > 0 )
+            if ( tableRowStyle.length() > 0 ) {
                 tableRowElement.setAttribute( "class", htmlDocumentFacade
                         .getOrCreateCssClass( "r", tableRowStyle.toString() ) );
+            }
 
             if ( tableRow.isTableHeader() )
             {