]> source.dussan.org Git - poi.git/commitdiff
Sonar fixes
authorAndreas Beeker <kiwiwings@apache.org>
Sat, 23 Jan 2021 23:04:49 +0000 (23:04 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Sat, 23 Jan 2021 23:04:49 +0000 (23:04 +0000)
add asserts to tests

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1885859 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/util/DateFormatConverter.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFName.java
src/scratchpad/src/org/apache/poi/hwpf/converter/AbstractWordConverter.java
src/scratchpad/testcases/org/apache/poi/hdgf/streams/TestStreamBugs.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestDataValidation.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestNamedRange.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java
src/testcases/org/apache/poi/ss/util/TestDateFormatConverter.java

index deb4050daf2f13ad10785f90e44b51f52900286b..e338e8485c4ce38b36770834c72568dedf6269c2 100644 (file)
@@ -133,28 +133,30 @@ public final class DateFormatConverter  {
                result.put( "S", "0" );
                result.put( "SS", "00" );
                result.put( "SSS", "000" );
+               result.put( "y", "yyyy" );
 
                return result;
        }
 
        public static String getPrefixForLocale( Locale locale ) {
                final String languageTag = locale.toLanguageTag();
-               if ("".equals(languageTag)) {
+               if (Locale.ROOT.equals(locale) || "".equals(languageTag)) {
                        // JDK 8 adds an empty locale-string, see also https://issues.apache.org/jira/browse/LANG-941
-                       return "[$-0409]";
+                       return "";
                }
 
                LocaleID loc = LocaleID.lookupByLanguageTag(languageTag);
                if (loc == null) {
-                       String cmpTag = (languageTag.indexOf('_') > -1) ? languageTag.replace('_','-') : languageTag;
+                       String cmpTag = (languageTag.indexOf('_') > -1) ? languageTag.replace('_', '-') : languageTag;
                        int idx = languageTag.length();
-                       while (loc == null && (idx = cmpTag.lastIndexOf('-', idx-1)) > 0) {
+                       while (loc == null && (idx = cmpTag.lastIndexOf('-', idx - 1)) > 0) {
                                loc = LocaleID.lookupByLanguageTag(languageTag.substring(0, idx));
                        }
-                       if (loc == null) {
-                               LOG.log( POILogger.ERROR, "Unable to find prefix for Locale '", languageTag, "' or its parent locales." );
-                               return "";
-                       }
+               }
+
+               if (loc == null) {
+                       LOG.log(POILogger.ERROR, "Unable to find prefix for Locale '", languageTag, "' or its parent locales.");
+                       return "";
                }
 
                return String.format(Locale.ROOT, "[$-%04X]", loc.getLcid());
index 19d0bbb2b4255d81512037c34376d52ed334ef62..0792ddc655ba086feb9e3dd2f99ae11826343007 100644 (file)
 
 package org.apache.poi.xssf.usermodel;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.util.Arrays;
 
 import org.apache.poi.ss.usermodel.BaseTestNamedRange;
 import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.XSSFITestDataProvider;
+import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.junit.jupiter.api.Test;
 
-/**
- * @author Yegor Kozlov
- */
 public final class TestXSSFName extends BaseTestNamedRange {
 
     public TestXSSFName() {
index b6b56c8bca5421d141968eac68ba5c2b566e94e6..741ee21c47c0836387272afb2afd5ccde561f257 100644 (file)
@@ -56,124 +56,108 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 @Beta
-public abstract class AbstractWordConverter
-{
-    private static class DeadFieldBoundaries
-    {
+public abstract class AbstractWordConverter {
+    private static class DeadFieldBoundaries {
         final int beginMark;
         final int endMark;
         final int separatorMark;
 
-        public DeadFieldBoundaries( int beginMark, int separatorMark,
-                int endMark )
-        {
+        public DeadFieldBoundaries(int beginMark, int separatorMark,
+            int endMark) {
             this.beginMark = beginMark;
             this.separatorMark = separatorMark;
             this.endMark = endMark;
         }
     }
 
-    private static final class Structure implements Comparable<Structure>
-    {
+    private static final class Structure implements Comparable<Structure> {
         final int end;
         final int start;
         final Object structure;
 
-        Structure( Bookmark bookmark )
-        {
+        Structure(Bookmark bookmark) {
             this.start = bookmark.getStart();
             this.end = bookmark.getEnd();
             this.structure = bookmark;
         }
 
-        Structure( DeadFieldBoundaries deadFieldBoundaries, int start, int end )
-        {
+        Structure(DeadFieldBoundaries deadFieldBoundaries, int start, int end) {
             this.start = start;
             this.end = end;
             this.structure = deadFieldBoundaries;
         }
 
-        Structure( Field field )
-        {
+        Structure(Field field) {
             this.start = field.getFieldStartOffset();
             this.end = field.getFieldEndOffset();
             this.structure = field;
         }
 
-        public int compareTo( Structure o )
-        {
+        public int compareTo(Structure o) {
             return Integer.compare(start, o.start);
         }
 
         @Override
-        public String toString()
-        {
+        public String toString() {
             return "Structure [" + start + "; " + end + "): "
-                    + structure;
+                + structure;
         }
     }
 
     private static final byte BEL_MARK = 7;
 
     private static final byte FIELD_BEGIN_MARK = 19;
-
     private static final byte FIELD_END_MARK = 21;
-
     private static final byte FIELD_SEPARATOR_MARK = 20;
+    private static final int FIELD_PAGE_REFERENCE = 37;
+    private static final int FIELD_EMBEDDED_OBJECT = 58;
+    private static final int FIELD_DROP_DOWN = 83;
+    private static final int FIELD_HYPERLINK = 88;
 
-    private static final POILogger LOG = POILogFactory.getLogger( AbstractWordConverter.class );
+
+    private static final POILogger LOG = POILogFactory.getLogger(AbstractWordConverter.class);
 
     private static final Pattern PATTERN_HYPERLINK_EXTERNAL = Pattern
-            .compile( "^[ \\t\\r\\n]*HYPERLINK \"(.*)\".*$" );
+        .compile("^[ \\t\\r\\n]*HYPERLINK \"(.*)\".*$");
 
     private static final Pattern PATTERN_HYPERLINK_LOCAL = Pattern
-            .compile( "^[ \\t\\r\\n]*HYPERLINK \\\\l \"(.*)\"[ ](.*)$" );
+        .compile("^[ \\t\\r\\n]*HYPERLINK \\\\l \"(.*)\"[ ](.*)$");
 
     private static final Pattern PATTERN_PAGEREF = Pattern
-            .compile( "^[ \\t\\r\\n]*PAGEREF ([^ ]*)[ \\t\\r\\n]*\\\\h.*$" );
+        .compile("^[ \\t\\r\\n]*PAGEREF ([^ ]*)[ \\t\\r\\n]*\\\\h.*$");
 
     private static final byte SPECCHAR_AUTONUMBERED_FOOTNOTE_REFERENCE = 2;
-
     private static final byte SPECCHAR_DRAWN_OBJECT = 8;
 
     protected static final char UNICODECHAR_NO_BREAK_SPACE = '\u00a0';
-
     protected static final char UNICODECHAR_NONBREAKING_HYPHEN = '\u2011';
-
     protected static final char UNICODECHAR_ZERO_WIDTH_SPACE = '\u200b';
 
-    private static void addToStructures( List<Structure> structures,
-            Structure structure )
-    {
-        for ( Iterator<Structure> iterator = structures.iterator(); iterator
-                .hasNext(); )
-        {
+    private static void addToStructures(List<Structure> structures,
+        Structure structure) {
+        for (Iterator<Structure> iterator = structures.iterator(); iterator
+            .hasNext(); ) {
             Structure another = iterator.next();
 
-            if ( another.start <= structure.start
-                    && another.end >= structure.start )
-            {
+            if (another.start <= structure.start
+                && another.end >= structure.start) {
                 return;
             }
 
-            if ( ( structure.start < another.start && another.start < structure.end )
-                    || ( structure.start < another.start && another.end <= structure.end )
-                    || ( structure.start <= another.start && another.end < structure.end ) )
-            {
+            if ((structure.start < another.start && another.start < structure.end)
+                || (structure.start < another.start && another.end <= structure.end)
+                || (structure.start <= another.start && another.end < structure.end)) {
                 iterator.remove();
-                continue;
             }
         }
-        structures.add( structure );
+        structures.add(structure);
     }
 
     private final Set<Bookmark> bookmarkStack = new LinkedHashSet<>();
 
     private FontReplacer fontReplacer = new DefaultFontReplacer();
 
-    private POILogger log = POILogFactory.getLogger( getClass() );
-
-    private NumberingState numberingState = new NumberingState();
+    private final NumberingState numberingState = new NumberingState();
 
     private PicturesManager picturesManager;
 
@@ -182,116 +166,107 @@ public abstract class AbstractWordConverter
      * updating stylesheets or building document notes list. Usually they are
      * called once, but it's okay to call them several times.
      */
-    protected void afterProcess()
-    {
+    protected void afterProcess() {
         // by default no such actions needed
     }
 
-    protected Triplet getCharacterRunTriplet(CharacterRun characterRun )
-    {
+    protected Triplet getCharacterRunTriplet(CharacterRun characterRun) {
         Triplet original = new Triplet();
         original.bold = characterRun.isBold();
         original.italic = characterRun.isItalic();
         original.fontName = characterRun.getFontName();
-        return getFontReplacer().update( original );
+        return getFontReplacer().update(original);
     }
 
     public abstract Document getDocument();
 
-    public FontReplacer getFontReplacer()
-    {
+    public FontReplacer getFontReplacer() {
         return fontReplacer;
     }
 
-    protected int getNumberColumnsSpanned( int[] tableCellEdges,
-            int currentEdgeIndex, TableCell tableCell )
-    {
+    protected int getNumberColumnsSpanned(int[] tableCellEdges,
+        int currentEdgeIndex, TableCell tableCell) {
         int nextEdgeIndex = currentEdgeIndex;
         int colSpan = 0;
         int cellRightEdge = tableCell.getLeftEdge() + tableCell.getWidth();
-        while ( tableCellEdges[nextEdgeIndex] < cellRightEdge )
-        {
+        while (tableCellEdges[nextEdgeIndex] < cellRightEdge) {
             colSpan++;
             nextEdgeIndex++;
         }
         return colSpan;
     }
 
-    protected int getNumberRowsSpanned( Table table,
-            final int[] tableCellEdges, int currentRowIndex,
-            int currentColumnIndex, TableCell tableCell )
-    {
-        if ( !tableCell.isFirstVerticallyMerged() )
+    protected int getNumberRowsSpanned(Table table,
+        final int[] tableCellEdges, int currentRowIndex,
+        int currentColumnIndex, TableCell tableCell) {
+        if (!tableCell.isFirstVerticallyMerged()) {
             return 1;
+        }
 
         final int numRows = table.numRows();
 
         int count = 1;
-        for ( int r1 = currentRowIndex + 1; r1 < numRows; r1++ )
-        {
-            TableRow nextRow = table.getRow( r1 );
-            if ( currentColumnIndex >= nextRow.numCells() )
+        for (int r1 = currentRowIndex + 1; r1 < numRows; r1++) {
+            TableRow nextRow = table.getRow(r1);
+            if (currentColumnIndex >= nextRow.numCells()) {
                 break;
+            }
 
             // we need to skip row if he don't have cells at all
             boolean hasCells = false;
             int currentEdgeIndex = 0;
-            for ( int c = 0; c < nextRow.numCells(); c++ )
-            {
-                TableCell nextTableCell = nextRow.getCell( c );
-                if ( !nextTableCell.isVerticallyMerged()
-                        || nextTableCell.isFirstVerticallyMerged() )
-                {
-                    int colSpan = getNumberColumnsSpanned( tableCellEdges,
-                            currentEdgeIndex, nextTableCell );
+            for (int c = 0; c < nextRow.numCells(); c++) {
+                TableCell nextTableCell = nextRow.getCell(c);
+                if (!nextTableCell.isVerticallyMerged()
+                    || nextTableCell.isFirstVerticallyMerged()) {
+                    int colSpan = getNumberColumnsSpanned(tableCellEdges,
+                        currentEdgeIndex, nextTableCell);
                     currentEdgeIndex += colSpan;
 
-                    if ( colSpan != 0 )
-                    {
+                    if (colSpan != 0) {
                         hasCells = true;
                         break;
                     }
-                }
-                else
-                {
+                } else {
                     currentEdgeIndex += getNumberColumnsSpanned(
-                            tableCellEdges, currentEdgeIndex, nextTableCell );
+                        tableCellEdges, currentEdgeIndex, nextTableCell);
                 }
             }
-            if ( !hasCells )
+            if (!hasCells) {
                 continue;
+            }
 
-            TableCell nextCell = nextRow.getCell( currentColumnIndex );
-            if ( !nextCell.isVerticallyMerged()
-                    || nextCell.isFirstVerticallyMerged() )
+            TableCell nextCell = nextRow.getCell(currentColumnIndex);
+            if (!nextCell.isVerticallyMerged()
+                || nextCell.isFirstVerticallyMerged()) {
                 break;
+            }
             count++;
         }
         return count;
     }
 
-    public PicturesManager getPicturesManager()
-    {
+    public PicturesManager getPicturesManager() {
         return picturesManager;
     }
 
-    protected abstract void outputCharacters( Element block,
-            CharacterRun characterRun, String text );
+    protected abstract void outputCharacters(Element block,
+        CharacterRun characterRun, String text);
 
     /**
      * Wrap range into bookmark(s) and process it. All bookmarks have starts
      * equal to range start and ends equal to range end. Usually it's only one
      * bookmark.
      */
-    protected abstract void processBookmarks( HWPFDocumentCore wordDocument,
-            Element currentBlock, Range range, int currentTableLevel,
-            List<Bookmark> rangeBookmarks );
-
-    protected boolean processCharacters( final HWPFDocumentCore wordDocument,
-            final int currentTableLevel, final Range range, final Element block )
-    {
-        if ( range == null )
+    protected abstract void processBookmarks(HWPFDocumentCore wordDocument,
+        Element currentBlock, Range range, int currentTableLevel,
+        List<Bookmark> rangeBookmarks);
+
+    protected boolean processCharacters(final HWPFDocumentCore wordDocument,
+        final int currentTableLevel, final Range range, final Element block) {
+        if (range == null) {
             return false;
+        }
 
         boolean haveAnyText = false;
 
@@ -302,62 +277,57 @@ public abstract class AbstractWordConverter
          * reconstruct the structure of range -- sergey
          */
         List<Structure> structures = new LinkedList<>();
-        if ( wordDocument instanceof HWPFDocument )
-        {
+        if (wordDocument instanceof HWPFDocument) {
             final HWPFDocument doc = (HWPFDocument) wordDocument;
 
             Map<Integer, List<Bookmark>> rangeBookmarks = doc.getBookmarks()
-                    .getBookmarksStartedBetween( range.getStartOffset(),
-                            range.getEndOffset() );
-
-            if ( rangeBookmarks != null )
-            {
-                for ( List<Bookmark> lists : rangeBookmarks.values() )
-                {
-                    for ( Bookmark bookmark : lists )
-                    {
-                        if ( !bookmarkStack.contains( bookmark ) )
-                            addToStructures( structures, new Structure(
-                                    bookmark ) );
+                .getBookmarksStartedBetween(range.getStartOffset(),
+                    range.getEndOffset());
+
+            if (rangeBookmarks != null) {
+                for (List<Bookmark> lists : rangeBookmarks.values()) {
+                    for (Bookmark bookmark : lists) {
+                        if (!bookmarkStack.contains(bookmark)) {
+                            addToStructures(structures, new Structure(
+                                bookmark));
+                        }
                     }
                 }
             }
 
             // TODO: dead fields?
             int skipUntil = -1;
-            for ( int c = 0; c < range.numCharacterRuns(); c++ )
-            {
-                CharacterRun characterRun = range.getCharacterRun( c );
-                if ( characterRun == null )
+            for (int c = 0; c < range.numCharacterRuns(); c++) {
+                CharacterRun characterRun = range.getCharacterRun(c);
+                if (characterRun == null) {
                     throw new AssertionError();
-                if ( characterRun.getStartOffset() < skipUntil )
+                }
+                if (characterRun.getStartOffset() < skipUntil) {
                     continue;
+                }
                 String text = characterRun.text();
-                if ( text == null || text.length() == 0
-                        || text.charAt( 0 ) != FIELD_BEGIN_MARK )
+                if (text == null || text.length() == 0
+                    || text.charAt(0) != FIELD_BEGIN_MARK) {
                     continue;
-
-                Field aliveField = ( (HWPFDocument) wordDocument ).getFields()
-                        .getFieldByStartOffset( FieldsDocumentPart.MAIN,
-                                characterRun.getStartOffset() );
-                if ( aliveField != null )
-                {
-                    addToStructures( structures, new Structure( aliveField ) );
                 }
-                else
-                {
+
+                Field aliveField = ((HWPFDocument) wordDocument).getFields()
+                    .getFieldByStartOffset(FieldsDocumentPart.MAIN,
+                        characterRun.getStartOffset());
+                if (aliveField != null) {
+                    addToStructures(structures, new Structure(aliveField));
+                } else {
                     int[] separatorEnd = tryDeadField_lookupFieldSeparatorEnd(
-                            wordDocument, range, c );
-                    if ( separatorEnd != null )
-                    {
+                        range, c);
+                    if (separatorEnd != null) {
                         addToStructures(
-                                structures,
-                                new Structure( new DeadFieldBoundaries( c,
-                                        separatorEnd[0], separatorEnd[1] ),
-                                        characterRun.getStartOffset(), range
-                                                .getCharacterRun(
-                                                        separatorEnd[1] )
-                                                .getEndOffset() ) );
+                            structures,
+                            new Structure(new DeadFieldBoundaries(c,
+                                separatorEnd[0], separatorEnd[1]),
+                                characterRun.getStartOffset(), range
+                                .getCharacterRun(
+                                    separatorEnd[1])
+                                .getEndOffset()));
                         c = separatorEnd[1];
                     }
                 }
@@ -365,261 +335,221 @@ public abstract class AbstractWordConverter
         }
 
         structures = new ArrayList<>(structures);
-        Collections.sort( structures );
+        Collections.sort(structures);
 
         int previous = range.getStartOffset();
-        for ( Structure structure : structures )
-        {
-            if ( structure.start != previous )
-            {
-                Range subrange = new Range( previous, structure.start, range )
-                {
+        for (Structure structure : structures) {
+            if (structure.start != previous) {
+                Range subrange = new Range(previous, structure.start, range) {
                     @Override
-                    public String toString()
-                    {
+                    public String toString() {
                         return "BetweenStructuresSubrange " + super.toString();
                     }
                 };
-                processCharacters( wordDocument, currentTableLevel, subrange,
-                        block );
+                processCharacters(wordDocument, currentTableLevel, subrange,
+                    block);
             }
 
-            if ( structure.structure instanceof Bookmark )
-            {
+            if (structure.structure instanceof Bookmark) {
+                assert(wordDocument instanceof HWPFDocument);
                 // other bookmarks with same boundaries
                 List<Bookmark> bookmarks = new LinkedList<>();
-                for ( Bookmark bookmark : ( (HWPFDocument) wordDocument )
-                        .getBookmarks()
-                        .getBookmarksStartedBetween( structure.start,
-                                structure.start + 1 ).values().iterator()
-                        .next() )
-                {
-                    if ( bookmark.getStart() == structure.start
-                            && bookmark.getEnd() == structure.end )
-                    {
-                        bookmarks.add( bookmark );
+                for (Bookmark bookmark : ((HWPFDocument) wordDocument)
+                    .getBookmarks()
+                    .getBookmarksStartedBetween(structure.start,
+                        structure.start + 1).values().iterator()
+                    .next()) {
+                    if (bookmark.getStart() == structure.start
+                        && bookmark.getEnd() == structure.end) {
+                        bookmarks.add(bookmark);
                     }
                 }
 
-                bookmarkStack.addAll( bookmarks );
-                try
-                {
-                    int end = Math.min( range.getEndOffset(), structure.end );
-                    Range subrange = new Range( structure.start, end, range )
-                    {
+                bookmarkStack.addAll(bookmarks);
+                try {
+                    int end = Math.min(range.getEndOffset(), structure.end);
+                    Range subrange = new Range(structure.start, end, range) {
                         @Override
-                        public String toString()
-                        {
+                        public String toString() {
                             return "BookmarksSubrange " + super.toString();
                         }
                     };
 
-                    processBookmarks( wordDocument, block, subrange,
-                            currentTableLevel, bookmarks );
+                    processBookmarks(wordDocument, block, subrange,
+                        currentTableLevel, bookmarks);
+                } finally {
+                    bookmarkStack.removeAll(bookmarks);
                 }
-                finally
-                {
-                    bookmarkStack.removeAll( bookmarks );
-                }
-            }
-            else if ( structure.structure instanceof Field )
-            {
+            } else if (structure.structure instanceof Field) {
+                assert(wordDocument instanceof HWPFDocument);
                 Field field = (Field) structure.structure;
-                processField( (HWPFDocument) wordDocument, range,
-                        currentTableLevel, field, block );
-            }
-            else if ( structure.structure instanceof DeadFieldBoundaries )
-            {
+                processField((HWPFDocument) wordDocument, range, currentTableLevel, field, block);
+            } else if (structure.structure instanceof DeadFieldBoundaries) {
                 DeadFieldBoundaries boundaries = (DeadFieldBoundaries) structure.structure;
-                processDeadField( wordDocument, block, range,
-                        currentTableLevel, boundaries.beginMark,
-                        boundaries.separatorMark, boundaries.endMark );
-            }
-            else
-            {
-                throw new UnsupportedOperationException( "NYI: "
-                        + structure.structure.getClass() );
+                processDeadField(wordDocument, block, range,
+                    currentTableLevel, boundaries.beginMark,
+                    boundaries.separatorMark, boundaries.endMark);
+            } else {
+                throw new UnsupportedOperationException("NYI: "
+                    + structure.structure.getClass());
             }
 
-            previous = Math.min( range.getEndOffset(), structure.end );
+            previous = Math.min(range.getEndOffset(), structure.end);
         }
 
-        if ( previous != range.getStartOffset() )
-        {
-            if ( previous > range.getEndOffset() )
-            {
-                LOG.log( POILogger.WARN, "Latest structure in ", range,
-                        " ended at #", previous, " after range boundaries [",
-                        range.getStartOffset(), "; ", range.getEndOffset(),
-                        ")" );
+        if (previous != range.getStartOffset()) {
+            if (previous > range.getEndOffset()) {
+                LOG.log(POILogger.WARN, "Latest structure in ", range,
+                    " ended at #", previous, " after range boundaries [",
+                    range.getStartOffset(), "; ", range.getEndOffset(),
+                    ")");
                 return true;
             }
 
-            if ( previous < range.getEndOffset() )
-            {
-                Range subrange = new Range( previous, range.getEndOffset(),
-                        range )
-                {
+            if (previous < range.getEndOffset()) {
+                Range subrange = new Range(previous, range.getEndOffset(),
+                    range) {
                     @Override
-                    public String toString()
-                    {
+                    public String toString() {
                         return "AfterStructureSubrange " + super.toString();
                     }
                 };
-                processCharacters( wordDocument, currentTableLevel, subrange,
-                        block );
+                processCharacters(wordDocument, currentTableLevel, subrange,
+                    block);
             }
             return true;
         }
 
-        for ( int c = 0; c < range.numCharacterRuns(); c++ )
-        {
-            CharacterRun characterRun = range.getCharacterRun( c );
+        for (int c = 0; c < range.numCharacterRuns(); c++) {
+            CharacterRun characterRun = range.getCharacterRun(c);
 
-            if ( characterRun == null )
+            if (characterRun == null) {
                 throw new AssertionError();
+            }
 
-            if ( wordDocument instanceof HWPFDocument
-                    && ( (HWPFDocument) wordDocument ).getPicturesTable()
-                            .hasPicture( characterRun ) )
-            {
+            if (wordDocument instanceof HWPFDocument
+                && ((HWPFDocument) wordDocument).getPicturesTable()
+                .hasPicture(characterRun)) {
                 HWPFDocument newFormat = (HWPFDocument) wordDocument;
                 Picture picture = newFormat.getPicturesTable().extractPicture(
-                        characterRun, true );
+                    characterRun, true);
 
-                processImage( block, characterRun.text().charAt( 0 ) == 0x01,
-                        picture );
+                processImage(block, characterRun.text().charAt(0) == 0x01,
+                    picture);
                 continue;
             }
 
             String text = characterRun.text();
-            if ( text.isEmpty() ) continue;
+            if (text.isEmpty()) {
+                continue;
+            }
 
-            if ( characterRun.isSpecialCharacter() )
-            {
-                if ( text.charAt( 0 ) == SPECCHAR_AUTONUMBERED_FOOTNOTE_REFERENCE
-                        && ( wordDocument instanceof HWPFDocument ) )
-                {
+            if (characterRun.isSpecialCharacter()) {
+                if (text.charAt(0) == SPECCHAR_AUTONUMBERED_FOOTNOTE_REFERENCE
+                    && (wordDocument instanceof HWPFDocument)) {
                     HWPFDocument doc = (HWPFDocument) wordDocument;
-                    processNoteAnchor( doc, characterRun, block );
+                    processNoteAnchor(doc, characterRun, block);
                     continue;
                 }
-                if ( text.charAt( 0 ) == SPECCHAR_DRAWN_OBJECT
-                        && ( wordDocument instanceof HWPFDocument ) )
-                {
+                if (text.charAt(0) == SPECCHAR_DRAWN_OBJECT
+                    && (wordDocument instanceof HWPFDocument)) {
                     HWPFDocument doc = (HWPFDocument) wordDocument;
-                    processDrawnObject( doc, characterRun, block );
+                    processDrawnObject(doc, characterRun, block);
                     continue;
                 }
-                if ( characterRun.isOle2()
-                        && ( wordDocument instanceof HWPFDocument ) )
-                {
+                if (characterRun.isOle2()
+                    && (wordDocument instanceof HWPFDocument)) {
                     HWPFDocument doc = (HWPFDocument) wordDocument;
-                    processOle2( doc, characterRun, block );
+                    processOle2(doc, characterRun, block);
                     continue;
                 }
-                if ( characterRun.isSymbol()
-                        && ( wordDocument instanceof HWPFDocument ) )
-                {
+                if (characterRun.isSymbol()
+                    && (wordDocument instanceof HWPFDocument)) {
                     HWPFDocument doc = (HWPFDocument) wordDocument;
-                    processSymbol( doc, characterRun, block );
+                    processSymbol(doc, characterRun, block);
                     continue;
                 }
             }
 
-            if ( text.charAt(0) == FIELD_BEGIN_MARK )
-            {
-                if ( wordDocument instanceof HWPFDocument )
-                {
-                    Field aliveField = ( (HWPFDocument) wordDocument )
-                            .getFields().getFieldByStartOffset(
-                                    FieldsDocumentPart.MAIN,
-                                    characterRun.getStartOffset() );
-                    if ( aliveField != null )
-                    {
-                        processField( ( (HWPFDocument) wordDocument ), range,
-                                currentTableLevel, aliveField, block );
+            if (text.charAt(0) == FIELD_BEGIN_MARK) {
+                if (wordDocument instanceof HWPFDocument) {
+                    Field aliveField = ((HWPFDocument) wordDocument)
+                        .getFields().getFieldByStartOffset(
+                            FieldsDocumentPart.MAIN,
+                            characterRun.getStartOffset());
+                    if (aliveField != null) {
+                        processField(((HWPFDocument) wordDocument), range,
+                            currentTableLevel, aliveField, block);
 
                         int continueAfter = aliveField.getFieldEndOffset();
-                        while ( c < range.numCharacterRuns()
-                                && range.getCharacterRun( c ).getEndOffset() <= continueAfter )
+                        while (c < range.numCharacterRuns()
+                            && range.getCharacterRun(c).getEndOffset() <= continueAfter) {
                             c++;
+                        }
 
-                        if ( c < range.numCharacterRuns() )
+                        if (c < range.numCharacterRuns()) {
                             c--;
+                        }
 
                         continue;
                     }
                 }
 
-                int skipTo = tryDeadField( wordDocument, range,
-                        currentTableLevel, c, block );
+                int skipTo = tryDeadField(wordDocument, range,
+                    currentTableLevel, c, block);
 
-                if ( skipTo != c )
-                {
+                if (skipTo != c) {
                     c = skipTo;
                     continue;
                 }
 
                 continue;
             }
-            if ( text.charAt(0) == FIELD_SEPARATOR_MARK )
-            {
+            if (text.charAt(0) == FIELD_SEPARATOR_MARK) {
                 // shall not appear without FIELD_BEGIN_MARK
                 continue;
             }
-            if ( text.charAt(0) == FIELD_END_MARK )
-            {
+            if (text.charAt(0) == FIELD_END_MARK) {
                 // shall not appear without FIELD_BEGIN_MARK
                 continue;
             }
 
-            if ( characterRun.isSpecialCharacter() || characterRun.isObj()
-                    || characterRun.isOle2() )
-            {
+            if (characterRun.isSpecialCharacter() || characterRun.isObj()
+                || characterRun.isOle2()) {
                 continue;
             }
 
-            if ( text.endsWith( "\r" )
-                    || ( text.charAt( text.length() - 1 ) == BEL_MARK && currentTableLevel != Integer.MIN_VALUE ) )
-                text = text.substring( 0, text.length() - 1 );
+            if (text.endsWith("\r")
+                || (text.charAt(text.length() - 1) == BEL_MARK && currentTableLevel != Integer.MIN_VALUE)) {
+                text = text.substring(0, text.length() - 1);
+            }
 
             {
                 // line breaks
                 StringBuilder stringBuilder = new StringBuilder();
-                for ( char charChar : text.toCharArray() )
-                {
-                    if ( charChar == 11 )
-                    {
-                        if ( stringBuilder.length() > 0 )
-                        {
-                            outputCharacters( block, characterRun,
-                                    stringBuilder.toString() );
-                            stringBuilder.setLength( 0 );
+                for (char charChar : text.toCharArray()) {
+                    if (charChar == 11) {
+                        if (stringBuilder.length() > 0) {
+                            outputCharacters(block, characterRun,
+                                stringBuilder.toString());
+                            stringBuilder.setLength(0);
                         }
-                        processLineBreak( block, characterRun );
-                    }
-                    else if ( charChar == 30 )
-                    {
+                        processLineBreak(block, characterRun);
+                    } else if (charChar == 30) {
                         // Non-breaking hyphens are stored as ASCII 30
-                        stringBuilder.append( UNICODECHAR_NONBREAKING_HYPHEN );
-                    }
-                    else if ( charChar == 31 )
-                    {
+                        stringBuilder.append(UNICODECHAR_NONBREAKING_HYPHEN);
+                    } else if (charChar == 31) {
                         // Non-required hyphens to zero-width space
-                        stringBuilder.append( UNICODECHAR_ZERO_WIDTH_SPACE );
-                    }
-                    else if ( charChar >= 0x20 || charChar == 0x09
-                            || charChar == 0x0A || charChar == 0x0D )
-                    {
-                        stringBuilder.append( charChar );
+                        stringBuilder.append(UNICODECHAR_ZERO_WIDTH_SPACE);
+                    } else if (charChar >= 0x20 || charChar == 0x09
+                        || charChar == 0x0A || charChar == 0x0D) {
+                        stringBuilder.append(charChar);
                     }
                 }
-                if ( stringBuilder.length() > 0 )
-                {
-                    outputCharacters( block, characterRun,
-                            stringBuilder.toString() );
-                    stringBuilder.setLength( 0 );
+                if (stringBuilder.length() > 0) {
+                    outputCharacters(block, characterRun,
+                        stringBuilder.toString());
+                    stringBuilder.setLength(0);
                 }
             }
 
@@ -629,291 +559,253 @@ public abstract class AbstractWordConverter
         return haveAnyText;
     }
 
-    protected void processDeadField( HWPFDocumentCore wordDocument,
-            Element currentBlock, Range range, int currentTableLevel,
-            int beginMark, int separatorMark, int endMark )
-    {
-        if ( beginMark + 1 < separatorMark && separatorMark + 1 < endMark )
-        {
-            Range formulaRange = new Range( range.getCharacterRun(
-                    beginMark + 1 ).getStartOffset(), range.getCharacterRun(
-                    separatorMark - 1 ).getEndOffset(), range )
-            {
+    protected void processDeadField(HWPFDocumentCore wordDocument,
+        Element currentBlock, Range range, int currentTableLevel,
+        int beginMark, int separatorMark, int endMark) {
+        if (beginMark + 1 < separatorMark && separatorMark + 1 < endMark) {
+            Range formulaRange = new Range(range.getCharacterRun(
+                beginMark + 1).getStartOffset(), range.getCharacterRun(
+                separatorMark - 1).getEndOffset(), range) {
                 @Override
-                public String toString()
-                {
+                public String toString() {
                     return "Dead field formula subrange: " + super.toString();
                 }
             };
-            Range valueRange = new Range( range.getCharacterRun(
-                    separatorMark + 1 ).getStartOffset(), range
-                    .getCharacterRun( endMark - 1 ).getEndOffset(), range )
-            {
+            Range valueRange = new Range(range.getCharacterRun(
+                separatorMark + 1).getStartOffset(), range
+                .getCharacterRun(endMark - 1).getEndOffset(), range) {
                 @Override
-                public String toString()
-                {
+                public String toString() {
                     return "Dead field value subrange: " + super.toString();
                 }
             };
             String formula = formulaRange.text();
-            final Matcher matcher = PATTERN_HYPERLINK_LOCAL.matcher( formula );
-            if ( matcher.matches() )
-            {
-                String localref = matcher.group( 1 );
-                processPageref( wordDocument, currentBlock, valueRange,
-                        currentTableLevel, localref );
+            final Matcher matcher = PATTERN_HYPERLINK_LOCAL.matcher(formula);
+            if (matcher.matches()) {
+                String localref = matcher.group(1);
+                processPageref(wordDocument, currentBlock, valueRange,
+                    currentTableLevel, localref);
                 return;
             }
         }
 
-        StringBuilder debug = new StringBuilder( "Unsupported field type: \n" );
-        for ( int i = beginMark; i <= endMark; i++ )
-        {
-            debug.append( "\t" );
-            debug.append( range.getCharacterRun( i ) );
-            debug.append( "\n" );
+        StringBuilder debug = new StringBuilder("Unsupported field type: \n");
+        for (int i = beginMark; i <= endMark; i++) {
+            debug.append("\t");
+            debug.append(range.getCharacterRun(i));
+            debug.append("\n");
         }
-        LOG.log( POILogger.WARN, debug );
+        LOG.log(POILogger.WARN, debug);
 
-        Range deadFieldValueSubrage = new Range( range.getCharacterRun(
-                separatorMark ).getStartOffset() + 1, range.getCharacterRun(
-                endMark ).getStartOffset(), range )
-        {
+        Range deadFieldValueSubrage = new Range(range.getCharacterRun(
+            separatorMark).getStartOffset() + 1, range.getCharacterRun(
+            endMark).getStartOffset(), range) {
             @Override
-            public String toString()
-            {
+            public String toString() {
                 return "DeadFieldValueSubrange (" + super.toString() + ")";
             }
         };
 
         // just output field value
-        if ( separatorMark + 1 < endMark )
-            processCharacters( wordDocument, currentTableLevel,
-                    deadFieldValueSubrage, currentBlock );
+        if (separatorMark + 1 < endMark) {
+            processCharacters(wordDocument, currentTableLevel,
+                deadFieldValueSubrage, currentBlock);
+        }
     }
 
-    public void processDocument( HWPFDocumentCore wordDocument )
-    {
-        try
-        {
+    public void processDocument(HWPFDocumentCore wordDocument) {
+        try {
             final SummaryInformation summaryInformation = wordDocument
-                    .getSummaryInformation();
-            if ( summaryInformation != null )
-            {
-                processDocumentInformation( summaryInformation );
+                .getSummaryInformation();
+            if (summaryInformation != null) {
+                processDocumentInformation(summaryInformation);
             }
-        }
-        catch ( Exception exc )
-        {
-            LOG.log( POILogger.WARN,
-                    "Unable to process document summary information: ", exc,
-                    exc );
+        } catch (Exception exc) {
+            LOG.log(POILogger.WARN, "Unable to process document summary information: ", exc, exc);
         }
 
         final Range docRange = wordDocument.getRange();
 
-        if ( docRange.numSections() == 1 )
-        {
-            processSingleSection( wordDocument, docRange.getSection( 0 ) );
+        if (docRange.numSections() == 1) {
+            processSingleSection(wordDocument, docRange.getSection(0));
             afterProcess();
             return;
         }
 
-        processDocumentPart( wordDocument, docRange );
+        processDocumentPart(wordDocument, docRange);
         afterProcess();
     }
 
     protected abstract void processDocumentInformation(
-            SummaryInformation summaryInformation );
+        SummaryInformation summaryInformation);
 
-    protected void processDocumentPart( HWPFDocumentCore wordDocument,
-            final Range range )
-    {
-        for ( int s = 0; s < range.numSections(); s++ )
-        {
-            processSection( wordDocument, range.getSection( s ), s );
+    protected void processDocumentPart(HWPFDocumentCore wordDocument,
+        final Range range) {
+        for (int s = 0; s < range.numSections(); s++) {
+            processSection(wordDocument, range.getSection(s), s);
         }
     }
 
-    protected void processDrawnObject( HWPFDocument doc,
-            CharacterRun characterRun, Element block )
-    {
-        if ( getPicturesManager() == null )
+    protected void processDrawnObject(HWPFDocument doc,
+        CharacterRun characterRun, Element block) {
+        if (getPicturesManager() == null) {
             return;
+        }
 
         // TODO: support headers
         OfficeDrawing officeDrawing = doc.getOfficeDrawingsMain()
-                .getOfficeDrawingAt( characterRun.getStartOffset() );
-        if ( officeDrawing == null )
-        {
-            LOG.log( POILogger.WARN, "Characters #", characterRun,
-                    " references missing drawn object" );
+            .getOfficeDrawingAt(characterRun.getStartOffset());
+        if (officeDrawing == null) {
+            LOG.log(POILogger.WARN, "Characters #", characterRun,
+                " references missing drawn object");
             return;
         }
 
         byte[] pictureData = officeDrawing.getPictureData();
-        if ( pictureData == null )
-            // usual shape?
+        if (pictureData == null)
+        // usual shape?
+        {
             return;
+        }
 
-        float width = ( officeDrawing.getRectangleRight() - officeDrawing
-                .getRectangleLeft() ) / AbstractWordUtils.TWIPS_PER_INCH;
-        float height = ( officeDrawing.getRectangleBottom() - officeDrawing
-                .getRectangleTop() ) / AbstractWordUtils.TWIPS_PER_INCH;
+        float width = (officeDrawing.getRectangleRight() - officeDrawing
+            .getRectangleLeft()) / AbstractWordUtils.TWIPS_PER_INCH;
+        float height = (officeDrawing.getRectangleBottom() - officeDrawing
+            .getRectangleTop()) / AbstractWordUtils.TWIPS_PER_INCH;
 
-        final PictureType type = PictureType.findMatchingType( pictureData );
+        final PictureType type = PictureType.findMatchingType(pictureData);
         String path = getPicturesManager()
-                .savePicture( pictureData, type,
-                        "s" + characterRun.getStartOffset() + "." + type,
-                        width, height );
+            .savePicture(pictureData, type,
+                "s" + characterRun.getStartOffset() + "." + type,
+                width, height);
 
-        processDrawnObject( doc, characterRun, officeDrawing, path, block );
+        processDrawnObject(doc, characterRun, officeDrawing, path, block);
     }
 
-    protected abstract void processDrawnObject( HWPFDocument doc,
-            CharacterRun characterRun, OfficeDrawing officeDrawing,
-            String path, Element block );
+    protected abstract void processDrawnObject(HWPFDocument doc,
+        CharacterRun characterRun, OfficeDrawing officeDrawing,
+        String path, Element block);
 
-    protected void processDropDownList( Element block,
-            CharacterRun characterRun, String[] values, int defaultIndex )
-    {
-        outputCharacters( block, characterRun, values[defaultIndex] );
+    protected void processDropDownList(Element block,
+        CharacterRun characterRun, String[] values, int defaultIndex) {
+        outputCharacters(block, characterRun, values[defaultIndex]);
     }
 
     protected abstract void processEndnoteAutonumbered(
-            HWPFDocument wordDocument, int noteIndex, Element block,
-            Range endnoteTextRange );
-
-    protected void processField( HWPFDocument wordDocument, Range parentRange,
-            int currentTableLevel, Field field, Element currentBlock )
-    {
-        switch ( field.getType() )
-        {
-        case 37: // page reference
-        {
-            final Range firstSubrange = field.firstSubrange( parentRange );
-            if ( firstSubrange != null )
-            {
-                String formula = firstSubrange.text();
-                Matcher matcher = PATTERN_PAGEREF.matcher( formula );
-                if ( matcher.find() )
-                {
-                    String pageref = matcher.group( 1 );
-                    processPageref( wordDocument, currentBlock,
-                            field.secondSubrange( parentRange ),
-                            currentTableLevel, pageref );
-                    return;
+        HWPFDocument wordDocument, int noteIndex, Element block,
+        Range endnoteTextRange);
+
+    protected void processField(HWPFDocument wordDocument, Range parentRange,
+        int currentTableLevel, Field field, Element currentBlock) {
+        switch (field.getType()) {
+            case FIELD_PAGE_REFERENCE: {
+                final Range firstSubrange = field.firstSubrange(parentRange);
+                if (firstSubrange != null) {
+                    String formula = firstSubrange.text();
+                    Matcher matcher = PATTERN_PAGEREF.matcher(formula);
+                    if (matcher.find()) {
+                        String pageref = matcher.group(1);
+                        processPageref(wordDocument, currentBlock,
+                            field.secondSubrange(parentRange),
+                            currentTableLevel, pageref);
+                        return;
+                    }
                 }
+                break;
             }
-            break;
-        }
-        case 58: // Embedded Object
-        {
-            if ( !field.hasSeparator() )
-            {
-                LOG.log( POILogger.WARN, parentRange, " contains ", field,
-                        " with 'Embedded Object' but without separator mark" );
-                return;
-            }
+            case FIELD_EMBEDDED_OBJECT: {
+                if (!field.hasSeparator()) {
+                    LOG.log(POILogger.WARN, parentRange, " contains ", field,
+                        " with 'Embedded Object' but without separator mark");
+                    return;
+                }
 
-            CharacterRun separator = field
-                    .getMarkSeparatorCharacterRun( parentRange );
+                CharacterRun separator = field
+                    .getMarkSeparatorCharacterRun(parentRange);
 
-            if ( separator.isOle2() )
-            {
-                // the only supported so far
-                boolean processed = processOle2( wordDocument, separator,
-                        currentBlock );
-
-                // if we didn't output OLE - output field value
-                if ( !processed )
-                {
-                    processCharacters( wordDocument, currentTableLevel,
-                            field.secondSubrange( parentRange ), currentBlock );
-                }
+                if (separator.isOle2()) {
+                    // the only supported so far
+                    boolean processed = processOle2(wordDocument, separator,
+                        currentBlock);
 
-                return;
-            }
+                    // if we didn't output OLE - output field value
+                    if (!processed) {
+                        processCharacters(wordDocument, currentTableLevel,
+                            field.secondSubrange(parentRange), currentBlock);
+                    }
 
-            break;
-        }
-        case 83: // drop down
-        {
-            Range fieldContent = field.firstSubrange( parentRange );
-            CharacterRun cr = fieldContent.getCharacterRun( fieldContent
-                    .numCharacterRuns() - 1 );
-            String[] values = cr.getDropDownListValues();
-            Integer defIndex = cr.getDropDownListDefaultItemIndex();
+                    return;
+                }
 
-            if ( values != null && values.length > 0 )
-            {
-                processDropDownList( currentBlock, cr, values,
-                        defIndex == null ? -1 : defIndex.intValue() );
-                return;
+                break;
             }
-            break;
-        }
-        case 88: // hyperlink
-        {
-            final Range firstSubrange = field.firstSubrange( parentRange );
-            if ( firstSubrange != null )
-            {
-                String formula = firstSubrange.text();
-                Matcher matcher = PATTERN_HYPERLINK_EXTERNAL.matcher( formula );
-                if ( matcher.matches() )
-                {
-                    String hyperlink = matcher.group( 1 );
-                    processHyperlink( wordDocument, currentBlock,
-                            field.secondSubrange( parentRange ),
-                            currentTableLevel, hyperlink );
+            case FIELD_DROP_DOWN: {
+                Range fieldContent = field.firstSubrange(parentRange);
+                CharacterRun cr = fieldContent.getCharacterRun(fieldContent
+                    .numCharacterRuns() - 1);
+                String[] values = cr.getDropDownListValues();
+                Integer defIndex = cr.getDropDownListDefaultItemIndex();
+
+                if (values != null && values.length > 0) {
+                    processDropDownList(currentBlock, cr, values,
+                        defIndex == null ? -1 : defIndex);
                     return;
                 }
-                matcher.usePattern( PATTERN_HYPERLINK_LOCAL );
-                if ( matcher.matches() )
-                {
-                    String hyperlink = matcher.group( 1 );
-                    Range textRange = null;
-                    String text = matcher.group( 2 );
-                    if ( AbstractWordUtils.isNotEmpty( text ) )
-                    {
-                        textRange = new Range( firstSubrange.getStartOffset()
-                                + matcher.start( 2 ),
+                break;
+            }
+            case FIELD_HYPERLINK: {
+                final Range firstSubrange = field.firstSubrange(parentRange);
+                if (firstSubrange != null) {
+                    String formula = firstSubrange.text();
+                    Matcher matcher = PATTERN_HYPERLINK_EXTERNAL.matcher(formula);
+                    if (matcher.matches()) {
+                        String hyperlink = matcher.group(1);
+                        processHyperlink(wordDocument, currentBlock,
+                            field.secondSubrange(parentRange),
+                            currentTableLevel, hyperlink);
+                        return;
+                    }
+                    matcher.usePattern(PATTERN_HYPERLINK_LOCAL);
+                    if (matcher.matches()) {
+                        String hyperlink = matcher.group(1);
+                        Range textRange = null;
+                        String text = matcher.group(2);
+                        if (AbstractWordUtils.isNotEmpty(text)) {
+                            textRange = new Range(firstSubrange.getStartOffset()
+                                + matcher.start(2),
                                 firstSubrange.getStartOffset()
-                                        + matcher.end( 2 ), firstSubrange )
-                        {
-                            @Override
-                            public String toString()
-                            {
-                                return "Local hyperlink text";
-                            }
-                        };
+                                    + matcher.end(2), firstSubrange) {
+                                @Override
+                                public String toString() {
+                                    return "Local hyperlink text";
+                                }
+                            };
+                        }
+                        processPageref(wordDocument, currentBlock, textRange,
+                            currentTableLevel, hyperlink);
+                        return;
                     }
-                    processPageref( wordDocument, currentBlock, textRange,
-                            currentTableLevel, hyperlink );
-                    return;
                 }
+                break;
             }
-            break;
-        }
         }
 
-        LOG.log( POILogger.WARN, parentRange, " contains ", field,
-                " with unsupported type or format" );
-        processCharacters( wordDocument, currentTableLevel,
-                field.secondSubrange( parentRange ), currentBlock );
+        LOG.log(POILogger.WARN, parentRange, " contains ", field, " with unsupported type or format");
+        processCharacters(wordDocument, currentTableLevel,
+            field.secondSubrange(parentRange), currentBlock);
     }
 
     protected abstract void processFootnoteAutonumbered(
-            HWPFDocument wordDocument, int noteIndex, Element block,
-            Range footnoteTextRange );
+        HWPFDocument wordDocument, int noteIndex, Element block,
+        Range footnoteTextRange);
 
-    protected abstract void processHyperlink( HWPFDocumentCore wordDocument,
-            Element currentBlock, Range textRange, int currentTableLevel,
-            String hyperlink );
+    protected abstract void processHyperlink(HWPFDocumentCore wordDocument,
+        Element currentBlock, Range textRange, int currentTableLevel,
+        String hyperlink);
 
-    protected void processImage( Element currentBlock, boolean inlined, Picture picture ) {
+    protected void processImage(Element currentBlock, boolean inlined, Picture picture) {
         PicturesManager fileManager = getPicturesManager();
-        if ( fileManager != null ) {
+        if (fileManager != null) {
             final float aspectRatioX = picture.getHorizontalScalingFactor();
             final float aspectRatioY = picture.getVerticalScalingFactor();
 
@@ -929,259 +821,197 @@ public abstract class AbstractWordConverter
             }
             imageHeight /= AbstractWordUtils.TWIPS_PER_INCH;
 
-            String url = fileManager.savePicture( picture.getContent(),
-                    picture.suggestPictureType(),
-                    picture.suggestFullFileName(), imageWidth, imageHeight );
+            String url = fileManager.savePicture(picture.getContent(),
+                picture.suggestPictureType(),
+                picture.suggestFullFileName(), imageWidth, imageHeight);
 
-            if ( AbstractWordUtils.isNotEmpty( url ) )
-            {
-                processImage( currentBlock, inlined, picture, url );
+            if (AbstractWordUtils.isNotEmpty(url)) {
+                processImage(currentBlock, inlined, picture, url);
                 return;
             }
         }
 
-        processImageWithoutPicturesManager( currentBlock, inlined, picture );
+        processImageWithoutPicturesManager(currentBlock, inlined, picture);
 
     }
 
-    protected abstract void processImage( Element currentBlock,
-            boolean inlined, Picture picture, String url );
+    protected abstract void processImage(Element currentBlock,
+        boolean inlined, Picture picture, String url);
 
     @Internal
     protected abstract void processImageWithoutPicturesManager(
-            Element currentBlock, boolean inlined, Picture picture );
+        Element currentBlock, boolean inlined, Picture picture);
 
-    protected abstract void processLineBreak( Element block,
-            CharacterRun characterRun );
+    protected abstract void processLineBreak(Element block, CharacterRun characterRun);
 
-    protected void processNoteAnchor( HWPFDocument doc,
-            CharacterRun characterRun, final Element block )
-    {
-        {
-            Notes footnotes = doc.getFootnotes();
-            int noteIndex = footnotes
-                    .getNoteIndexByAnchorPosition( characterRun
-                            .getStartOffset() );
-            if ( noteIndex != -1 )
-            {
-                Range footnoteRange = doc.getFootnoteRange();
-                int rangeStartOffset = footnoteRange.getStartOffset();
-                int noteTextStartOffset = footnotes
-                        .getNoteTextStartOffset( noteIndex );
-                int noteTextEndOffset = footnotes
-                        .getNoteTextEndOffset( noteIndex );
-
-                Range noteTextRange = new Range( rangeStartOffset
-                        + noteTextStartOffset, rangeStartOffset
-                        + noteTextEndOffset, doc );
-
-                processFootnoteAutonumbered( doc, noteIndex, block,
-                        noteTextRange );
-                return;
-            }
+    protected void processNoteAnchor(HWPFDocument doc, CharacterRun characterRun, final Element block) {
+        Notes footnotes = doc.getFootnotes();
+        int footIndex = footnotes.getNoteIndexByAnchorPosition(characterRun.getStartOffset());
+        if (footIndex != -1) {
+            Range footRange = doc.getFootnoteRange();
+            int rangeStartOffset = footRange.getStartOffset();
+            int noteTextStartOffset = footnotes.getNoteTextStartOffset(footIndex);
+            int noteTextEndOffset = footnotes.getNoteTextEndOffset(footIndex);
+
+            Range noteTextRange = new Range(rangeStartOffset
+                + noteTextStartOffset, rangeStartOffset
+                + noteTextEndOffset, doc);
+
+            processFootnoteAutonumbered(doc, footIndex, block, noteTextRange);
+            return;
         }
-        {
-            Notes endnotes = doc.getEndnotes();
-            int noteIndex = endnotes.getNoteIndexByAnchorPosition( characterRun
-                    .getStartOffset() );
-            if ( noteIndex != -1 )
-            {
-                Range endnoteRange = doc.getEndnoteRange();
-                int rangeStartOffset = endnoteRange.getStartOffset();
-                int noteTextStartOffset = endnotes
-                        .getNoteTextStartOffset( noteIndex );
-                int noteTextEndOffset = endnotes
-                        .getNoteTextEndOffset( noteIndex );
-
-                Range noteTextRange = new Range( rangeStartOffset
-                        + noteTextStartOffset, rangeStartOffset
-                        + noteTextEndOffset, doc );
-
-                processEndnoteAutonumbered( doc, noteIndex, block,
-                        noteTextRange );
-            }
+
+        Notes endnotes = doc.getEndnotes();
+        int endIndex = endnotes.getNoteIndexByAnchorPosition(characterRun.getStartOffset());
+        if (endIndex != -1) {
+            Range endnoteRange = doc.getEndnoteRange();
+            int rangeStartOffset = endnoteRange.getStartOffset();
+            int noteTextStartOffset = endnotes.getNoteTextStartOffset(endIndex);
+            int noteTextEndOffset = endnotes.getNoteTextEndOffset(endIndex);
+
+            Range noteTextRange = new Range(rangeStartOffset
+                + noteTextStartOffset, rangeStartOffset
+                + noteTextEndOffset, doc);
+
+            processEndnoteAutonumbered(doc, endIndex, block, noteTextRange);
         }
     }
 
-    private boolean processOle2( HWPFDocument doc, CharacterRun characterRun,
-            Element block )
-    {
-        Entry entry = doc.getObjectsPool().getObjectById(
-                "_" + characterRun.getPicOffset() );
-        if ( entry == null )
-        {
-            LOG.log( POILogger.WARN, "Referenced OLE2 object '",
-                    Integer.valueOf( characterRun.getPicOffset() ),
-                    "' not found in ObjectPool" );
+    private boolean processOle2(HWPFDocument doc, CharacterRun characterRun,
+        Element block) {
+        Entry entry = doc.getObjectsPool().getObjectById("_" + characterRun.getPicOffset());
+        if (entry == null) {
+            LOG.log(POILogger.WARN, "Referenced OLE2 object '", characterRun.getPicOffset(), "' not found in ObjectPool");
             return false;
         }
 
-        try
-        {
-            return processOle2( doc, block, entry );
-        }
-        catch ( Exception exc )
-        {
-            LOG.log( POILogger.WARN,
-                    "Unable to convert internal OLE2 object '",
-                    Integer.valueOf( characterRun.getPicOffset() ), "': ", exc,
-                    exc );
+        try {
+            return processOle2(doc, block, entry);
+        } catch (Exception exc) {
+            LOG.log(POILogger.WARN, "Unable to convert internal OLE2 object '", characterRun.getPicOffset(), "': ", exc, exc);
             return false;
         }
     }
 
-    protected boolean processOle2( HWPFDocument wordDocument, Element block,
-            Entry entry ) throws Exception
-    {
+    protected boolean processOle2(HWPFDocument wordDocument, Element block, Entry entry) throws Exception {
         return false;
     }
 
-    protected abstract void processPageBreak( HWPFDocumentCore wordDocument,
-            Element flow );
+    protected abstract void processPageBreak(HWPFDocumentCore wordDocument, Element flow);
 
-    protected abstract void processPageref( HWPFDocumentCore wordDocument,
-            Element currentBlock, Range textRange, int currentTableLevel,
-            String pageref );
+    protected abstract void processPageref(HWPFDocumentCore wordDocument,
+        Element currentBlock, Range textRange, int currentTableLevel,
+        String pageref);
 
-    protected abstract void processParagraph( HWPFDocumentCore wordDocument,
-            Element parentElement, int currentTableLevel, Paragraph paragraph,
-            String bulletText );
+    protected abstract void processParagraph(HWPFDocumentCore wordDocument,
+        Element parentElement, int currentTableLevel, Paragraph paragraph,
+        String bulletText);
 
-    protected void processParagraphes( HWPFDocumentCore wordDocument,
-            Element flow, Range range, int currentTableLevel )
-    {
+    protected void processParagraphes(HWPFDocumentCore wordDocument, Element flow, Range range, int currentTableLevel) {
         final int paragraphs = range.numParagraphs();
-        for ( int p = 0; p < paragraphs; p++ )
-        {
-            Paragraph paragraph = range.getParagraph( p );
+        for (int p = 0; p < paragraphs; p++) {
+            Paragraph paragraph = range.getParagraph(p);
+
+            if (paragraph.isInTable()
+                && paragraph.getTableLevel() != currentTableLevel) {
+                if (paragraph.getTableLevel() < currentTableLevel) {
+                    throw new IllegalStateException("Trying to process table cell with higher level (" +
+                        paragraph.getTableLevel() + ") than current table level ("
+                        + currentTableLevel + ") as inner table part");
+                }
 
-            if ( paragraph.isInTable()
-                    && paragraph.getTableLevel() != currentTableLevel )
-            {
-                if ( paragraph.getTableLevel() < currentTableLevel )
-                    throw new IllegalStateException(
-                            "Trying to process table cell with higher level ("
-                                    + paragraph.getTableLevel()
-                                    + ") than current table level ("
-                                    + currentTableLevel
-                                    + ") as inner table part" );
-
-                Table table = range.getTable( paragraph );
-                processTable( wordDocument, flow, table );
-
-                p += table.numParagraphs();
-                p--;
+                Table table = range.getTable(paragraph);
+                processTable(wordDocument, flow, table);
+
+                p += table.numParagraphs() - 1;
                 continue;
             }
 
-            if ( paragraph.text().equals( "\u000c" ) )
-            {
-                processPageBreak( wordDocument, flow );
+            if (paragraph.text().equals("\u000c")) {
+                processPageBreak(wordDocument, flow);
             }
 
             boolean processed = false;
-            if ( paragraph.isInList() )
-            {
-                try
-                {
+            if (paragraph.isInList()) {
+                try {
                     HWPFList hwpfList = paragraph.getList();
 
                     String label = AbstractWordUtils.getBulletText(
-                            numberingState, hwpfList,
-                            (char) paragraph.getIlvl() );
+                        numberingState, hwpfList,
+                        (char) paragraph.getIlvl());
 
-                    processParagraph( wordDocument, flow, currentTableLevel,
-                            paragraph, label );
+                    processParagraph(wordDocument, flow, currentTableLevel, paragraph, label);
                     processed = true;
-                }
-                catch ( Exception exc )
-                {
-                    log.log(
-                            POILogger.WARN,
-                            "Can't process paragraph as list entry, will be processed without list information",
-                            exc );
+                } catch (Exception exc) {
+                    LOG.log(POILogger.WARN, "Can't process paragraph as list entry, will be processed without list information", exc);
                 }
             }
 
-            if (!processed)
-            {
-                processParagraph( wordDocument, flow, currentTableLevel,
-                        paragraph, AbstractWordUtils.EMPTY );
+            if (!processed) {
+                processParagraph(wordDocument, flow, currentTableLevel,
+                    paragraph, AbstractWordUtils.EMPTY);
             }
         }
 
     }
 
-    protected abstract void processSection( HWPFDocumentCore wordDocument,
-            Section section, int s );
+    protected abstract void processSection(HWPFDocumentCore wordDocument, Section section, int s);
 
-    protected void processSingleSection( HWPFDocumentCore wordDocument,
-            Section section )
-    {
-        processSection( wordDocument, section, 0 );
+    protected void processSingleSection(HWPFDocumentCore wordDocument, Section section) {
+        processSection(wordDocument, section, 0);
     }
 
-    protected void processSymbol( HWPFDocument doc, CharacterRun characterRun,
-            Element block )
-    {
+    protected void processSymbol(HWPFDocument doc, CharacterRun characterRun, Element block) {
 
     }
 
-    protected abstract void processTable( HWPFDocumentCore wordDocument,
-            Element flow, Table table );
+    protected abstract void processTable(HWPFDocumentCore wordDocument, Element flow, Table table);
 
-    public void setFontReplacer( FontReplacer fontReplacer )
-    {
+    public void setFontReplacer(FontReplacer fontReplacer) {
         this.fontReplacer = fontReplacer;
     }
 
-    public void setPicturesManager( PicturesManager fileManager )
-    {
+    public void setPicturesManager(PicturesManager fileManager) {
         this.picturesManager = fileManager;
     }
 
-    protected int tryDeadField( HWPFDocumentCore wordDocument, Range range,
-            int currentTableLevel, int beginMark, Element currentBlock )
-    {
+    protected int tryDeadField(HWPFDocumentCore wordDocument, Range range,
+        int currentTableLevel, int beginMark, Element currentBlock) {
         int[] separatorEnd = tryDeadField_lookupFieldSeparatorEnd(
-                wordDocument, range, beginMark );
-        if ( separatorEnd == null )
+            range, beginMark);
+        if (separatorEnd == null) {
             return beginMark;
+        }
 
-        processDeadField( wordDocument, currentBlock, range, currentTableLevel,
-                beginMark, separatorEnd[0], separatorEnd[1] );
+        processDeadField(wordDocument, currentBlock, range, currentTableLevel,
+            beginMark, separatorEnd[0], separatorEnd[1]);
 
         return separatorEnd[1];
     }
 
-    private int[] tryDeadField_lookupFieldSeparatorEnd(
-            HWPFDocumentCore wordDocument, Range range, int beginMark )
-    {
+    private int[] tryDeadField_lookupFieldSeparatorEnd(Range range, int beginMark) {
         int separatorMark = -1;
         int endMark = -1;
-        for ( int c = beginMark + 1; c < range.numCharacterRuns(); c++ )
-        {
-            CharacterRun characterRun = range.getCharacterRun( c );
+        for (int c = beginMark + 1; c < range.numCharacterRuns(); c++) {
+            CharacterRun characterRun = range.getCharacterRun(c);
 
             String text = characterRun.text();
-            if ( text.isEmpty() ) continue;
+            if (text.isEmpty()) {
+                continue;
+            }
 
             final char firstByte = text.charAt(0);
-            if ( firstByte == FIELD_BEGIN_MARK )
-            {
+            if (firstByte == FIELD_BEGIN_MARK) {
                 int[] nested = tryDeadField_lookupFieldSeparatorEnd(
-                        wordDocument, range, c );
-                if ( nested != null )
-                {
+                    range, c);
+                if (nested != null) {
                     c = nested[1];
                 }
                 continue;
             }
 
-            if ( firstByte == FIELD_SEPARATOR_MARK )
-            {
-                if ( separatorMark != -1 )
-                {
+            if (firstByte == FIELD_SEPARATOR_MARK) {
+                if (separatorMark != -1) {
                     // double; incorrect format
                     return null;
                 }
@@ -1190,23 +1020,17 @@ public abstract class AbstractWordConverter
                 continue;
             }
 
-            if ( firstByte == FIELD_END_MARK )
-            {
-                if ( endMark != -1 )
-                {
-                    // double;
-                    return null;
-                }
-
+            if (firstByte == FIELD_END_MARK) {
                 endMark = c;
                 break;
             }
         }
 
-        if ( separatorMark == -1 || endMark == -1 )
+        if (separatorMark == -1 || endMark == -1) {
             return null;
+        }
 
-        return new int[] { separatorMark, endMark };
+        return new int[]{separatorMark, endMark};
     }
 
 }
index f7cd422ddb639c30bdfcda05d67a5da9e642e3ea..47f33d0a15a4d48268d06a50717efc298f2f556f 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.poi.hdgf.streams;
 
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -60,7 +61,8 @@ public final class TestStreamBugs extends StreamTest {
        @Test
     void testGetTrailer() {
                Pointer trailerPointer = ptrFactory.createPointer(contents, 0x24);
-               Stream.createStream(trailerPointer, contents, chunkFactory, ptrFactory);
+               Stream s = Stream.createStream(trailerPointer, contents, chunkFactory, ptrFactory);
+               assertNotNull(s);
        }
 
        @SuppressWarnings("unused")
index 2ec30c43966ec3c2399bb99a78e2bd6854ebe5cf..d8adc7c529314c5bec08c9af7dbe88d8206f2848 100644 (file)
@@ -17,6 +17,7 @@
 
 package org.apache.poi.ss.usermodel;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -1318,7 +1319,7 @@ public abstract class BaseTestBugzillaIssues {
             sheet.setRowGroupCollapsed(0, true);
 
             sheet.groupColumn(0, 0);
-            sheet.setColumnGroupCollapsed(0, true);
+            assertDoesNotThrow(() -> sheet.setColumnGroupCollapsed(0, true));
         }
     }
 
@@ -1328,7 +1329,7 @@ public abstract class BaseTestBugzillaIssues {
     void test58648() throws IOException {
         try (Workbook wb = _testDataProvider.createWorkbook()) {
             Cell cell = wb.createSheet().createRow(0).createCell(0);
-            cell.setCellFormula("((1 + 1) )");
+            assertDoesNotThrow(() -> cell.setCellFormula("((1 + 1) )"));
         }
     }
 
@@ -1441,9 +1442,11 @@ public abstract class BaseTestBugzillaIssues {
         return time() - startTimeMillis;
     }
 
-    @Disabled("bug 59393")
     @Test
     void bug59393_commentsCanHaveSameAnchor() throws IOException {
+        // only executed for HSSF currently
+        assumeTrue("xls".equals(_testDataProvider.getStandardFileNameExtension()));
+
         try (Workbook wb = _testDataProvider.createWorkbook()) {
 
             Sheet sheet = wb.createSheet();
@@ -1473,14 +1476,13 @@ public abstract class BaseTestBugzillaIssues {
             Comment comment2 = drawing.createCellComment(anchor);
             RichTextString richTextString2 = helper.createRichTextString("comment2");
             comment2.setString(richTextString2);
-            cell2.setCellComment(comment2);
+            assertDoesNotThrow(() -> cell2.setCellComment(comment2));
 
             // anchor.setCol1(2);
             Comment comment3 = drawing.createCellComment(anchor);
             RichTextString richTextString3 = helper.createRichTextString("comment3");
             comment3.setString(richTextString3);
-            cell3.setCellComment(comment3);
-
+            assertDoesNotThrow(() -> cell3.setCellComment(comment3));
         }
     }
 
index 64a85c64ee37903544beddae2c827ed26caaed79..4d3954fa784b2ae1d9ff6824809d658f3406c996 100644 (file)
@@ -1221,7 +1221,8 @@ public abstract class BaseTestConditionalFormatting {
                     CellRangeAddress.valueOf("C9:D30"), CellRangeAddress.valueOf("C7:C31")
             };
             ConditionalFormattingRule rule = sheet.getSheetConditionalFormatting().createConditionalFormattingRule("$A$1>0");
-            sheet.getSheetConditionalFormatting().addConditionalFormatting(ranges, rule);
+            int form = sheet.getSheetConditionalFormatting().addConditionalFormatting(ranges, rule);
+            assertEquals(0, form);
         }
     }
 
index d1d70c6131cc64a2d3e304b08a1b0e348e7d59b9..ccfd8293c047f3b95003cde3b381a60f769d7b4b 100644 (file)
 
 package org.apache.poi.ss.usermodel;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import org.apache.poi.ss.ITestDataProvider;
 import org.apache.poi.ss.usermodel.DataValidation.ErrorStyle;
 import org.apache.poi.ss.usermodel.DataValidationConstraint.OperatorType;
 import org.apache.poi.ss.usermodel.DataValidationConstraint.ValidationType;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellRangeAddressList;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -35,472 +35,458 @@ import org.junit.jupiter.api.Test;
 public abstract class BaseTestDataValidation {
     private final ITestDataProvider _testDataProvider;
 
-    private static final POILogger log = POILogFactory.getLogger(BaseTestDataValidation.class);
-
     protected BaseTestDataValidation(ITestDataProvider testDataProvider) {
         _testDataProvider = testDataProvider;
     }
 
-       /** Convenient access to ERROR_STYLE constants */
-       protected static final DataValidation.ErrorStyle ES = null;
-       /** Convenient access to OPERATOR constants */
-       protected static final DataValidationConstraint.ValidationType VT = null;
-       /** Convenient access to OPERATOR constants */
-       protected static final DataValidationConstraint.OperatorType OP = null;
-
-       private static final class ValidationAdder {
-
-               private final CellStyle _style_1;
-               private final CellStyle _style_2;
-               private  final int _validationType;
-               private final Sheet _sheet;
-               private int _currentRowIndex;
-               private final CellStyle _cellStyle;
-
-               public ValidationAdder(Sheet fSheet, CellStyle style_1, CellStyle style_2,
-                               CellStyle cellStyle, int validationType) {
-                       _sheet = fSheet;
-                       _style_1 = style_1;
-                       _style_2 = style_2;
-                       _cellStyle = cellStyle;
-                       _validationType = validationType;
-                       _currentRowIndex = fSheet.getPhysicalNumberOfRows();
-               }
-               void addValidation(int operatorType, String firstFormula, String secondFormula,
-                               int errorStyle, String ruleDescr, String promptDescr,
-                               boolean allowEmpty, boolean inputBox, boolean errorBox) {
-                       String[] explicitListValues = null;
-
-                       addValidationInternal(operatorType, firstFormula, secondFormula, errorStyle, ruleDescr,
-                                       promptDescr, allowEmpty, inputBox, errorBox, true,
-                                       explicitListValues);
-               }
-
-               private void addValidationInternal(int operatorType, String firstFormula,
-                               String secondFormula, int errorStyle, String ruleDescr, String promptDescr,
-                               boolean allowEmpty, boolean inputBox, boolean errorBox, boolean suppressDropDown,
-                               String[] explicitListValues) {
-                       int rowNum = _currentRowIndex++;
-
-                       DataValidationHelper dataValidationHelper = _sheet.getDataValidationHelper();
-                       DataValidationConstraint dc = createConstraint(dataValidationHelper,operatorType, firstFormula, secondFormula, explicitListValues);
-
-                       DataValidation dv = dataValidationHelper.createValidation(dc,new CellRangeAddressList(rowNum, rowNum, 0, 0));
-
-                       dv.setEmptyCellAllowed(allowEmpty);
-                       dv.setErrorStyle(errorStyle);
-                       dv.createErrorBox("Invalid Input", "Something is wrong - check condition!");
-                       dv.createPromptBox("Validated Cell", "Allowable values have been restricted");
-
-                       dv.setShowPromptBox(inputBox);
-                       dv.setShowErrorBox(errorBox);
-                       dv.setSuppressDropDownArrow(suppressDropDown);
-
-
-                       _sheet.addValidationData(dv);
-                       writeDataValidationSettings(_sheet, _style_1, _style_2, ruleDescr, allowEmpty,
-                                       inputBox, errorBox);
-                       if (_cellStyle != null) {
-                               Row row = _sheet.getRow(_sheet.getPhysicalNumberOfRows() - 1);
-                               Cell cell = row.createCell(0);
-                               cell.setCellStyle(_cellStyle);
-                       }
-                       writeOtherSettings(_sheet, _style_1, promptDescr);
-               }
-               private DataValidationConstraint createConstraint(DataValidationHelper dataValidationHelper,int operatorType, String firstFormula,
-                               String secondFormula, String[] explicitListValues) {
-                       if (_validationType == ValidationType.LIST) {
-                               if (explicitListValues != null) {
-                                       return dataValidationHelper.createExplicitListConstraint(explicitListValues);
-                               }
-                               return dataValidationHelper.createFormulaListConstraint(firstFormula);
-                       }
-                       if (_validationType == ValidationType.TIME) {
-                               return dataValidationHelper.createTimeConstraint(operatorType, firstFormula, secondFormula);
-                       }
-                       if (_validationType == ValidationType.DATE) {
-                               return dataValidationHelper.createDateConstraint(operatorType, firstFormula, secondFormula, null);
-                       }
-                       if (_validationType == ValidationType.FORMULA) {
-                               return dataValidationHelper.createCustomConstraint(firstFormula);
-                       }
-
-                       if( _validationType == ValidationType.INTEGER) {
-                               return dataValidationHelper.createIntegerConstraint(operatorType, firstFormula, secondFormula);
-                       }
-                       if( _validationType == ValidationType.DECIMAL) {
-                               return dataValidationHelper.createDecimalConstraint(operatorType, firstFormula, secondFormula);
-                       }
-                       if( _validationType == ValidationType.TEXT_LENGTH) {
-                               return dataValidationHelper.createTextLengthConstraint(operatorType, firstFormula, secondFormula);
-                       }
-                       return null;
-               }
-               /**
-                * writes plain text values into cells in a tabular format to form comments readable from within
-                * the spreadsheet.
-                */
-               private static void writeDataValidationSettings(Sheet sheet, CellStyle style_1,
-                               CellStyle style_2, String strCondition, boolean allowEmpty, boolean inputBox,
-                               boolean errorBox) {
-                       Row row = sheet.createRow(sheet.getPhysicalNumberOfRows());
-                       // condition's string
-                       Cell cell = row.createCell(1);
-                       cell.setCellStyle(style_1);
-                       setCellValue(cell, strCondition);
-                       // allow empty cells
-                       cell = row.createCell(2);
-                       cell.setCellStyle(style_2);
-                       setCellValue(cell, ((allowEmpty) ? "yes" : "no"));
-                       // show input box
-                       cell = row.createCell(3);
-                       cell.setCellStyle(style_2);
-                       setCellValue(cell, ((inputBox) ? "yes" : "no"));
-                       // show error box
-                       cell = row.createCell(4);
-                       cell.setCellStyle(style_2);
-                       setCellValue(cell, ((errorBox) ? "yes" : "no"));
-               }
-               private static void writeOtherSettings(Sheet sheet, CellStyle style,
-                               String strStettings) {
-                       Row row = sheet.getRow(sheet.getPhysicalNumberOfRows() - 1);
-                       Cell cell = row.createCell(5);
-                       cell.setCellStyle(style);
-                       setCellValue(cell, strStettings);
-               }
-               void addListValidation(String[] explicitListValues, String listFormula, String listValsDescr,
-                               boolean allowEmpty, boolean suppressDropDown) {
-                       String promptDescr = (allowEmpty ? "empty ok" : "not empty")
-                                       + ", " + (suppressDropDown ? "no drop-down" : "drop-down");
-                       addValidationInternal(ValidationType.LIST, listFormula, null, ErrorStyle.STOP, listValsDescr, promptDescr,
-                                       allowEmpty, false, true, suppressDropDown, explicitListValues);
-               }
-       }
-
-    private static void log(String msg) {
-        log.log(POILogger.INFO, msg);
+    /**
+     * Convenient access to ERROR_STYLE constants
+     */
+    protected static final DataValidation.ErrorStyle ES = null;
+    /**
+     * Convenient access to OPERATOR constants
+     */
+    protected static final DataValidationConstraint.ValidationType VT = null;
+
+    private static final class ValidationAdder {
+
+        private final CellStyle _style_1;
+        private final CellStyle _style_2;
+        private final int _validationType;
+        private final Sheet _sheet;
+        private int _currentRowIndex;
+        private final CellStyle _cellStyle;
+
+        public ValidationAdder(Sheet fSheet, CellStyle style_1, CellStyle style_2,
+            CellStyle cellStyle, int validationType) {
+            _sheet = fSheet;
+            _style_1 = style_1;
+            _style_2 = style_2;
+            _cellStyle = cellStyle;
+            _validationType = validationType;
+            _currentRowIndex = fSheet.getPhysicalNumberOfRows();
+        }
+
+        void addValidation(int operatorType, String firstFormula, String secondFormula,
+            int errorStyle, String ruleDescr, String promptDescr,
+            boolean allowEmpty, boolean inputBox, boolean errorBox) {
+            String[] explicitListValues = null;
+
+            addValidationInternal(operatorType, firstFormula, secondFormula, errorStyle, ruleDescr,
+                promptDescr, allowEmpty, inputBox, errorBox, true,
+                explicitListValues);
+        }
+
+        private void addValidationInternal(int operatorType, String firstFormula,
+            String secondFormula, int errorStyle, String ruleDescr, String promptDescr,
+            boolean allowEmpty, boolean inputBox, boolean errorBox, boolean suppressDropDown,
+            String[] explicitListValues) {
+            int rowNum = _currentRowIndex++;
+
+            DataValidationHelper dataValidationHelper = _sheet.getDataValidationHelper();
+            DataValidationConstraint dc = createConstraint(dataValidationHelper, operatorType, firstFormula, secondFormula, explicitListValues);
+
+            DataValidation dv = dataValidationHelper.createValidation(dc, new CellRangeAddressList(rowNum, rowNum, 0, 0));
+
+            dv.setEmptyCellAllowed(allowEmpty);
+            dv.setErrorStyle(errorStyle);
+            dv.createErrorBox("Invalid Input", "Something is wrong - check condition!");
+            dv.createPromptBox("Validated Cell", "Allowable values have been restricted");
+
+            dv.setShowPromptBox(inputBox);
+            dv.setShowErrorBox(errorBox);
+            dv.setSuppressDropDownArrow(suppressDropDown);
+
+
+            _sheet.addValidationData(dv);
+            writeDataValidationSettings(_sheet, _style_1, _style_2, ruleDescr, allowEmpty,
+                inputBox, errorBox);
+            if (_cellStyle != null) {
+                Row row = _sheet.getRow(_sheet.getPhysicalNumberOfRows() - 1);
+                Cell cell = row.createCell(0);
+                cell.setCellStyle(_cellStyle);
+            }
+            writeOtherSettings(_sheet, _style_1, promptDescr);
+        }
+
+        private DataValidationConstraint createConstraint(DataValidationHelper dataValidationHelper, int operatorType, String firstFormula,
+            String secondFormula, String[] explicitListValues) {
+            if (_validationType == ValidationType.LIST) {
+                if (explicitListValues != null) {
+                    return dataValidationHelper.createExplicitListConstraint(explicitListValues);
+                }
+                return dataValidationHelper.createFormulaListConstraint(firstFormula);
+            }
+            if (_validationType == ValidationType.TIME) {
+                return dataValidationHelper.createTimeConstraint(operatorType, firstFormula, secondFormula);
+            }
+            if (_validationType == ValidationType.DATE) {
+                return dataValidationHelper.createDateConstraint(operatorType, firstFormula, secondFormula, null);
+            }
+            if (_validationType == ValidationType.FORMULA) {
+                return dataValidationHelper.createCustomConstraint(firstFormula);
+            }
+
+            if (_validationType == ValidationType.INTEGER) {
+                return dataValidationHelper.createIntegerConstraint(operatorType, firstFormula, secondFormula);
+            }
+            if (_validationType == ValidationType.DECIMAL) {
+                return dataValidationHelper.createDecimalConstraint(operatorType, firstFormula, secondFormula);
+            }
+            if (_validationType == ValidationType.TEXT_LENGTH) {
+                return dataValidationHelper.createTextLengthConstraint(operatorType, firstFormula, secondFormula);
+            }
+            return null;
+        }
+
+        /**
+         * writes plain text values into cells in a tabular format to form comments readable from within
+         * the spreadsheet.
+         */
+        private static void writeDataValidationSettings(Sheet sheet, CellStyle style_1,
+            CellStyle style_2, String strCondition, boolean allowEmpty, boolean inputBox,
+            boolean errorBox) {
+            Row row = sheet.createRow(sheet.getPhysicalNumberOfRows());
+            // condition's string
+            Cell cell = row.createCell(1);
+            cell.setCellStyle(style_1);
+            setCellValue(cell, strCondition);
+            // allow empty cells
+            cell = row.createCell(2);
+            cell.setCellStyle(style_2);
+            setCellValue(cell, ((allowEmpty) ? "yes" : "no"));
+            // show input box
+            cell = row.createCell(3);
+            cell.setCellStyle(style_2);
+            setCellValue(cell, ((inputBox) ? "yes" : "no"));
+            // show error box
+            cell = row.createCell(4);
+            cell.setCellStyle(style_2);
+            setCellValue(cell, ((errorBox) ? "yes" : "no"));
+        }
+
+        private static void writeOtherSettings(Sheet sheet, CellStyle style,
+            String strStettings) {
+            Row row = sheet.getRow(sheet.getPhysicalNumberOfRows() - 1);
+            Cell cell = row.createCell(5);
+            cell.setCellStyle(style);
+            setCellValue(cell, strStettings);
+        }
+
+        void addListValidation(String[] explicitListValues, String listFormula, String listValsDescr,
+            boolean allowEmpty, boolean suppressDropDown) {
+            String promptDescr = (allowEmpty ? "empty ok" : "not empty")
+                + ", " + (suppressDropDown ? "no drop-down" : "drop-down");
+            addValidationInternal(ValidationType.LIST, listFormula, null, ErrorStyle.STOP, listValsDescr, promptDescr,
+                allowEmpty, false, true, suppressDropDown, explicitListValues);
+        }
+    }
+
+    /**
+     * Manages the cell styles used for formatting the output spreadsheet
+     */
+    private static final class WorkbookFormatter {
+
+        private final Workbook _wb;
+        private final CellStyle _style_1;
+        private final CellStyle _style_2;
+        private final CellStyle _style_3;
+        private final CellStyle _style_4;
+        private Sheet _currentSheet;
+
+        public WorkbookFormatter(Workbook wb) {
+            _wb = wb;
+            _style_1 = createStyle(wb, HorizontalAlignment.LEFT);
+            _style_2 = createStyle(wb, HorizontalAlignment.CENTER);
+            _style_3 = createStyle(wb, HorizontalAlignment.CENTER, IndexedColors.GREY_25_PERCENT.getIndex(), true);
+            _style_4 = createHeaderStyle(wb);
+        }
+
+        private static CellStyle createStyle(Workbook wb, HorizontalAlignment h_align, short color,
+            boolean bold) {
+            Font font = wb.createFont();
+            if (bold) {
+                font.setBold(true);
+            }
+
+            CellStyle cellStyle = wb.createCellStyle();
+            cellStyle.setFont(font);
+            cellStyle.setFillForegroundColor(color);
+            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+            cellStyle.setAlignment(h_align);
+            cellStyle.setBorderLeft(BorderStyle.THIN);
+            cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
+            cellStyle.setBorderTop(BorderStyle.THIN);
+            cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
+            cellStyle.setBorderRight(BorderStyle.THIN);
+            cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
+            cellStyle.setBorderBottom(BorderStyle.THIN);
+            cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
+
+            return cellStyle;
+        }
+
+        private static CellStyle createStyle(Workbook wb, HorizontalAlignment h_align) {
+            return createStyle(wb, h_align, IndexedColors.WHITE.getIndex(), false);
+        }
+
+        private static CellStyle createHeaderStyle(Workbook wb) {
+            Font font = wb.createFont();
+            font.setColor(IndexedColors.WHITE.getIndex());
+            font.setBold(true);
+
+            CellStyle cellStyle = wb.createCellStyle();
+            cellStyle.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex());
+            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+            cellStyle.setAlignment(HorizontalAlignment.CENTER);
+            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+            cellStyle.setBorderLeft(BorderStyle.THIN);
+            cellStyle.setLeftBorderColor(IndexedColors.WHITE.getIndex());
+            cellStyle.setBorderTop(BorderStyle.THIN);
+            cellStyle.setTopBorderColor(IndexedColors.WHITE.getIndex());
+            cellStyle.setBorderRight(BorderStyle.THIN);
+            cellStyle.setRightBorderColor(IndexedColors.WHITE.getIndex());
+            cellStyle.setBorderBottom(BorderStyle.THIN);
+            cellStyle.setBottomBorderColor(IndexedColors.WHITE.getIndex());
+            cellStyle.setFont(font);
+            return cellStyle;
+        }
+
+
+        public Sheet createSheet(String sheetName) {
+            _currentSheet = _wb.createSheet(sheetName);
+            return _currentSheet;
+        }
+
+        void createDVTypeRow(String strTypeDescription) {
+            Sheet sheet = _currentSheet;
+            Row row = sheet.createRow(sheet.getPhysicalNumberOfRows());
+            sheet.addMergedRegion(new CellRangeAddress(sheet.getPhysicalNumberOfRows() - 1, sheet.getPhysicalNumberOfRows() - 1, 0, 5));
+            Cell cell = row.createCell(0);
+            setCellValue(cell, strTypeDescription);
+            cell.setCellStyle(_style_3);
+            row = sheet.createRow(sheet.getPhysicalNumberOfRows());
+        }
+
+        void createHeaderRow() {
+            Sheet sheet = _currentSheet;
+            Row row = sheet.createRow(sheet.getPhysicalNumberOfRows());
+            row.setHeight((short) 400);
+            for (int i = 0; i < 6; i++) {
+                row.createCell(i).setCellStyle(_style_4);
+                if (i == 2 || i == 3 || i == 4) {
+                    sheet.setColumnWidth(i, 3500);
+                } else if (i == 5) {
+                    sheet.setColumnWidth(i, 10000);
+                } else {
+                    sheet.setColumnWidth(i, 8000);
+                }
+            }
+            Cell cell = row.getCell(0);
+            setCellValue(cell, "Data validation cells");
+            cell = row.getCell(1);
+            setCellValue(cell, "Condition");
+            cell = row.getCell(2);
+            setCellValue(cell, "Allow blank");
+            cell = row.getCell(3);
+            setCellValue(cell, "Prompt box");
+            cell = row.getCell(4);
+            setCellValue(cell, "Error box");
+            cell = row.getCell(5);
+            setCellValue(cell, "Other settings");
+        }
+
+        public ValidationAdder createValidationAdder(CellStyle cellStyle, int dataValidationType) {
+            return new ValidationAdder(_currentSheet, _style_1, _style_2, cellStyle, dataValidationType);
+        }
+
+        void createDVDescriptionRow(String strTypeDescription) {
+            Sheet sheet = _currentSheet;
+            Row row = sheet.getRow(sheet.getPhysicalNumberOfRows() - 1);
+            sheet.addMergedRegion(new CellRangeAddress(sheet.getPhysicalNumberOfRows() - 1, sheet.getPhysicalNumberOfRows() - 1, 0, 5));
+            Cell cell = row.createCell(0);
+            setCellValue(cell, strTypeDescription);
+            cell.setCellStyle(_style_3);
+            row = sheet.createRow(sheet.getPhysicalNumberOfRows());
+        }
+    }
+
+
+    private void addCustomValidations(WorkbookFormatter wf) {
+        wf.createSheet("Custom");
+        wf.createHeaderRow();
+
+        ValidationAdder va = wf.createValidationAdder(null, ValidationType.FORMULA);
+        va.addValidation(OperatorType.BETWEEN, "ISNUMBER($A2)", null, ErrorStyle.STOP, "ISNUMBER(A2)", "Error box type = STOP", true, true, true);
+        va.addValidation(OperatorType.BETWEEN, "IF(SUM(A2:A3)=5,TRUE,FALSE)", null, ErrorStyle.WARNING, "IF(SUM(A2:A3)=5,TRUE,FALSE)", "Error box type = WARNING", false, false, true);
+    }
+
+    private static void addSimpleNumericValidations(WorkbookFormatter wf) {
+        // data validation's number types
+        wf.createSheet("Numbers");
+
+        // "Whole number" validation type
+        wf.createDVTypeRow("Whole number");
+        wf.createHeaderRow();
+
+        ValidationAdder va = wf.createValidationAdder(null, ValidationType.INTEGER);
+        va.addValidation(OperatorType.BETWEEN, "2", "6", ErrorStyle.STOP, "Between 2 and 6 ", "Error box type = STOP", true, true, true);
+        va.addValidation(OperatorType.NOT_BETWEEN, "2", "6", ErrorStyle.INFO, "Not between 2 and 6 ", "Error box type = INFO", false, true, true);
+        va.addValidation(OperatorType.EQUAL, "=3+2", null, ErrorStyle.WARNING, "Equal to (3+2)", "Error box type = WARNING", false, false, true);
+        va.addValidation(OperatorType.NOT_EQUAL, "3", null, ErrorStyle.WARNING, "Not equal to 3", "-", false, false, false);
+        va.addValidation(OperatorType.GREATER_THAN, "3", null, ErrorStyle.WARNING, "Greater than 3", "-", true, false, false);
+        va.addValidation(OperatorType.LESS_THAN, "3", null, ErrorStyle.WARNING, "Less than 3", "-", true, true, false);
+        va.addValidation(OperatorType.GREATER_OR_EQUAL, "4", null, ErrorStyle.STOP, "Greater than or equal to 4", "Error box type = STOP", true, false, true);
+        va.addValidation(OperatorType.LESS_OR_EQUAL, "4", null, ErrorStyle.STOP, "Less than or equal to 4", "-", false, true, false);
+
+        // "Decimal" validation type
+        wf.createDVTypeRow("Decimal");
+        wf.createHeaderRow();
+
+        va = wf.createValidationAdder(null, ValidationType.DECIMAL);
+        va.addValidation(OperatorType.BETWEEN, "2", "6", ErrorStyle.STOP, "Between 2 and 6 ", "Error box type = STOP", true, true, true);
+        va.addValidation(OperatorType.NOT_BETWEEN, "2", "6", ErrorStyle.INFO, "Not between 2 and 6 ", "Error box type = INFO", false, true, true);
+        va.addValidation(OperatorType.EQUAL, "3", null, ErrorStyle.WARNING, "Equal to 3", "Error box type = WARNING", false, false, true);
+        va.addValidation(OperatorType.NOT_EQUAL, "3", null, ErrorStyle.WARNING, "Not equal to 3", "-", false, false, false);
+        va.addValidation(OperatorType.GREATER_THAN, "=12/6", null, ErrorStyle.WARNING, "Greater than (12/6)", "-", true, false, false);
+        va.addValidation(OperatorType.LESS_THAN, "3", null, ErrorStyle.WARNING, "Less than 3", "-", true, true, false);
+        va.addValidation(OperatorType.GREATER_OR_EQUAL, "4", null, ErrorStyle.STOP, "Greater than or equal to 4", "Error box type = STOP", true, false, true);
+        va.addValidation(OperatorType.LESS_OR_EQUAL, "4", null, ErrorStyle.STOP, "Less than or equal to 4", "-", false, true, false);
     }
 
-       /**
-        * Manages the cell styles used for formatting the output spreadsheet
-        */
-       private static final class WorkbookFormatter {
-
-               private final Workbook _wb;
-               private final CellStyle _style_1;
-               private final CellStyle _style_2;
-               private final CellStyle _style_3;
-               private final CellStyle _style_4;
-               private Sheet _currentSheet;
-
-               public WorkbookFormatter(Workbook wb) {
-                       _wb = wb;
-                       _style_1 = createStyle( wb, HorizontalAlignment.LEFT );
-                       _style_2 = createStyle( wb, HorizontalAlignment.CENTER );
-                       _style_3 = createStyle( wb, HorizontalAlignment.CENTER, IndexedColors.GREY_25_PERCENT.getIndex(), true );
-                       _style_4 = createHeaderStyle(wb);
-               }
-
-               private static CellStyle createStyle(Workbook wb, HorizontalAlignment h_align, short color,
-                               boolean bold) {
-                       Font font = wb.createFont();
-                       if (bold) {
-                               font.setBold(true);
-                       }
-
-                       CellStyle cellStyle = wb.createCellStyle();
-                       cellStyle.setFont(font);
-                       cellStyle.setFillForegroundColor(color);
-                       cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
-                       cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
-                       cellStyle.setAlignment(h_align);
-                       cellStyle.setBorderLeft(BorderStyle.THIN);
-                       cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
-                       cellStyle.setBorderTop(BorderStyle.THIN);
-                       cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
-                       cellStyle.setBorderRight(BorderStyle.THIN);
-                       cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
-                       cellStyle.setBorderBottom(BorderStyle.THIN);
-                       cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
-
-                       return cellStyle;
-               }
-
-               private static CellStyle createStyle(Workbook wb, HorizontalAlignment h_align) {
-                       return createStyle(wb, h_align, IndexedColors.WHITE.getIndex(), false);
-               }
-               private static CellStyle createHeaderStyle(Workbook wb) {
-                       Font font = wb.createFont();
-                       font.setColor( IndexedColors.WHITE.getIndex() );
-                       font.setBold(true);
-
-                       CellStyle cellStyle = wb.createCellStyle();
-                       cellStyle.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex());
-                       cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
-                       cellStyle.setAlignment(HorizontalAlignment.CENTER);
-                       cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
-                       cellStyle.setBorderLeft(BorderStyle.THIN);
-                       cellStyle.setLeftBorderColor(IndexedColors.WHITE.getIndex());
-                       cellStyle.setBorderTop(BorderStyle.THIN);
-                       cellStyle.setTopBorderColor(IndexedColors.WHITE.getIndex());
-                       cellStyle.setBorderRight(BorderStyle.THIN);
-                       cellStyle.setRightBorderColor(IndexedColors.WHITE.getIndex());
-                       cellStyle.setBorderBottom(BorderStyle.THIN);
-                       cellStyle.setBottomBorderColor(IndexedColors.WHITE.getIndex());
-                       cellStyle.setFont(font);
-                       return cellStyle;
-               }
-
-
-               public Sheet createSheet(String sheetName) {
-                       _currentSheet = _wb.createSheet(sheetName);
-                       return _currentSheet;
-               }
-               void createDVTypeRow(String strTypeDescription) {
-                       Sheet sheet = _currentSheet;
-                       Row row = sheet.createRow(sheet.getPhysicalNumberOfRows());
-                       sheet.addMergedRegion(new CellRangeAddress(sheet.getPhysicalNumberOfRows()-1, sheet.getPhysicalNumberOfRows()-1, 0, 5));
-                       Cell cell = row.createCell(0);
-                       setCellValue(cell, strTypeDescription);
-                       cell.setCellStyle(_style_3);
-                       row = sheet.createRow(sheet.getPhysicalNumberOfRows());
-               }
-
-               void createHeaderRow() {
-                       Sheet sheet = _currentSheet;
-                       Row row = sheet.createRow(sheet.getPhysicalNumberOfRows());
-                       row.setHeight((short) 400);
-                       for (int i = 0; i < 6; i++) {
-                               row.createCell(i).setCellStyle(_style_4);
-                               if (i == 2 || i == 3 || i == 4) {
-                                       sheet.setColumnWidth(i, 3500);
-                               } else if (i == 5) {
-                                       sheet.setColumnWidth(i, 10000);
-                               } else {
-                                       sheet.setColumnWidth(i, 8000);
-                               }
-                       }
-                       Cell cell = row.getCell(0);
-                       setCellValue(cell, "Data validation cells");
-                       cell = row.getCell(1);
-                       setCellValue(cell, "Condition");
-                       cell = row.getCell(2);
-                       setCellValue(cell, "Allow blank");
-                       cell = row.getCell(3);
-                       setCellValue(cell, "Prompt box");
-                       cell = row.getCell(4);
-                       setCellValue(cell, "Error box");
-                       cell = row.getCell(5);
-                       setCellValue(cell, "Other settings");
-               }
-
-               public ValidationAdder createValidationAdder(CellStyle cellStyle, int dataValidationType) {
-                       return new ValidationAdder(_currentSheet, _style_1, _style_2, cellStyle, dataValidationType);
-               }
-
-               void createDVDescriptionRow(String strTypeDescription) {
-                       Sheet sheet = _currentSheet;
-                       Row row = sheet.getRow(sheet.getPhysicalNumberOfRows()-1);
-                       sheet.addMergedRegion(new CellRangeAddress(sheet.getPhysicalNumberOfRows()-1, sheet.getPhysicalNumberOfRows()-1, 0, 5));
-                       Cell cell = row.createCell(0);
-                       setCellValue(cell, strTypeDescription);
-                       cell.setCellStyle(_style_3);
-                       row = sheet.createRow(sheet.getPhysicalNumberOfRows());
-               }
-       }
-
-
-       private void addCustomValidations(WorkbookFormatter wf) {
-               wf.createSheet("Custom");
-               wf.createHeaderRow();
-
-               ValidationAdder va = wf.createValidationAdder(null, ValidationType.FORMULA);
-               va.addValidation(OperatorType.BETWEEN, "ISNUMBER($A2)", null, ErrorStyle.STOP, "ISNUMBER(A2)", "Error box type = STOP", true, true, true);
-               va.addValidation(OperatorType.BETWEEN, "IF(SUM(A2:A3)=5,TRUE,FALSE)", null, ErrorStyle.WARNING, "IF(SUM(A2:A3)=5,TRUE,FALSE)", "Error box type = WARNING", false, false, true);
-       }
-
-       private static void addSimpleNumericValidations(WorkbookFormatter wf) {
-               // data validation's number types
-               wf.createSheet("Numbers");
-
-               // "Whole number" validation type
-               wf.createDVTypeRow("Whole number");
-               wf.createHeaderRow();
-
-               ValidationAdder va = wf.createValidationAdder(null, ValidationType.INTEGER);
-               va.addValidation(OperatorType.BETWEEN, "2", "6", ErrorStyle.STOP, "Between 2 and 6 ", "Error box type = STOP", true, true, true);
-               va.addValidation(OperatorType.NOT_BETWEEN, "2", "6", ErrorStyle.INFO, "Not between 2 and 6 ", "Error box type = INFO", false, true, true);
-               va.addValidation(OperatorType.EQUAL, "=3+2", null, ErrorStyle.WARNING, "Equal to (3+2)", "Error box type = WARNING", false, false, true);
-               va.addValidation(OperatorType.NOT_EQUAL, "3", null, ErrorStyle.WARNING, "Not equal to 3", "-", false, false, false);
-               va.addValidation(OperatorType.GREATER_THAN, "3", null, ErrorStyle.WARNING, "Greater than 3", "-", true, false, false);
-               va.addValidation(OperatorType.LESS_THAN, "3", null, ErrorStyle.WARNING, "Less than 3", "-", true, true, false);
-               va.addValidation(OperatorType.GREATER_OR_EQUAL, "4", null, ErrorStyle.STOP, "Greater than or equal to 4", "Error box type = STOP", true, false, true);
-               va.addValidation(OperatorType.LESS_OR_EQUAL, "4", null, ErrorStyle.STOP, "Less than or equal to 4", "-", false, true, false);
-
-               // "Decimal" validation type
-               wf.createDVTypeRow("Decimal");
-               wf.createHeaderRow();
-
-               va = wf.createValidationAdder(null, ValidationType.DECIMAL);
-               va.addValidation(OperatorType.BETWEEN, "2", "6", ErrorStyle.STOP, "Between 2 and 6 ", "Error box type = STOP", true, true, true);
-               va.addValidation(OperatorType.NOT_BETWEEN, "2", "6", ErrorStyle.INFO, "Not between 2 and 6 ", "Error box type = INFO", false, true, true);
-               va.addValidation(OperatorType.EQUAL, "3", null, ErrorStyle.WARNING, "Equal to 3", "Error box type = WARNING", false, false, true);
-               va.addValidation(OperatorType.NOT_EQUAL, "3", null, ErrorStyle.WARNING, "Not equal to 3", "-", false, false, false);
-               va.addValidation(OperatorType.GREATER_THAN, "=12/6", null, ErrorStyle.WARNING, "Greater than (12/6)", "-", true, false, false);
-               va.addValidation(OperatorType.LESS_THAN, "3", null, ErrorStyle.WARNING, "Less than 3", "-", true, true, false);
-               va.addValidation(OperatorType.GREATER_OR_EQUAL, "4", null, ErrorStyle.STOP, "Greater than or equal to 4", "Error box type = STOP", true, false, true);
-               va.addValidation(OperatorType.LESS_OR_EQUAL, "4", null, ErrorStyle.STOP, "Less than or equal to 4", "-", false, true, false);
-       }
-
-       private static void addListValidations(WorkbookFormatter wf, Workbook wb) {
-               final String cellStrValue
-                = "a b c d e f g h i j k l m n o p r s t u v x y z w 0 1 2 3 4 "
-               + "a b c d e f g h i j k l m n o p r s t u v x y z w 0 1 2 3 4 "
-               + "a b c d e f g h i j k l m n o p r s t u v x y z w 0 1 2 3 4 "
-               + "a b c d e f g h i j k l m n o p r s t u v x y z w 0 1 2 3 4 ";
-               final String dataSheetName = "list_data";
-               // "List" Data Validation type
-               Sheet fSheet = wf.createSheet("Lists");
-               Sheet dataSheet = wb.createSheet(dataSheetName);
-
-
-               wf.createDVTypeRow("Explicit lists - list items are explicitly provided");
-               wf.createDVDescriptionRow("Disadvantage - sum of item's length should be less than 255 characters");
-               wf.createHeaderRow();
-
-               ValidationAdder va = wf.createValidationAdder(null, ValidationType.LIST);
-               String listValsDescr = "POIFS,HSSF,HWPF,HPSF";
-               String[] listVals = listValsDescr.split(",");
-               va.addListValidation(listVals, null, listValsDescr, false, false);
-               va.addListValidation(listVals, null, listValsDescr, false, true);
-               va.addListValidation(listVals, null, listValsDescr, true, false);
-               va.addListValidation(listVals, null, listValsDescr, true, true);
-
-
-
-               wf.createDVTypeRow("Reference lists - list items are taken from others cells");
-               wf.createDVDescriptionRow("Advantage - no restriction regarding the sum of item's length");
-               wf.createHeaderRow();
-               va = wf.createValidationAdder(null, ValidationType.LIST);
-               String strFormula = "$A$30:$A$39";
-               va.addListValidation(null, strFormula, strFormula, false, false);
-
-               strFormula = dataSheetName + "!$A$1:$A$10";
-               va.addListValidation(null, strFormula, strFormula, false, false);
-               Name namedRange = wb.createName();
-               namedRange.setNameName("myName");
-               namedRange.setRefersToFormula(dataSheetName + "!$A$2:$A$7");
-               strFormula = "myName";
-               va.addListValidation(null, strFormula, strFormula, false, false);
-               strFormula = "offset(myName, 2, 1, 4, 2)"; // Note about last param '2':
-               // - Excel expects single row or single column when entered in UI, but process this OK otherwise
-               va.addListValidation(null, strFormula, strFormula, false, false);
-
-               // add list data on same sheet
-               for (int i = 0; i < 10; i++) {
-                       Row currRow = fSheet.createRow(i + 29);
-                       setCellValue(currRow.createCell(0), cellStrValue);
-               }
-               // add list data on another sheet
-               for (int i = 0; i < 10; i++) {
-                       Row currRow = dataSheet.createRow(i + 0);
-                       setCellValue(currRow.createCell(0), "Data a" + i);
-                       setCellValue(currRow.createCell(1), "Data b" + i);
-                       setCellValue(currRow.createCell(2), "Data c" + i);
-               }
-       }
-
-       private static void addDateTimeValidations(WorkbookFormatter wf, Workbook wb) {
-               wf.createSheet("Dates and Times");
-
-               DataFormat dataFormat = wb.createDataFormat();
-               short fmtDate = dataFormat.getFormat("m/d/yyyy");
-               short fmtTime = dataFormat.getFormat("h:mm");
-               CellStyle cellStyle_date = wb.createCellStyle();
-               cellStyle_date.setDataFormat(fmtDate);
-               CellStyle cellStyle_time = wb.createCellStyle();
-               cellStyle_time.setDataFormat(fmtTime);
-
-               wf.createDVTypeRow("Date ( cells are already formated as date - m/d/yyyy)");
-               wf.createHeaderRow();
-
-               ValidationAdder va = wf.createValidationAdder(cellStyle_date, ValidationType.DATE);
-               va.addValidation(OperatorType.BETWEEN,     "2004/01/02", "2004/01/06", ErrorStyle.STOP, "Between 1/2/2004 and 1/6/2004 ", "Error box type = STOP", true, true, true);
-               va.addValidation(OperatorType.NOT_BETWEEN, "2004/01/01", "2004/01/06", ErrorStyle.INFO, "Not between 1/2/2004 and 1/6/2004 ", "Error box type = INFO", false, true, true);
-               va.addValidation(OperatorType.EQUAL,       "2004/03/02", null,       ErrorStyle.WARNING, "Equal to 3/2/2004", "Error box type = WARNING", false, false, true);
-               va.addValidation(OperatorType.NOT_EQUAL,   "2004/03/02", null,       ErrorStyle.WARNING, "Not equal to 3/2/2004", "-", false, false, false);
-               va.addValidation(OperatorType.GREATER_THAN,"=DATEVALUE(\"4-Jul-2001\")", null,       ErrorStyle.WARNING, "Greater than DATEVALUE('4-Jul-2001')", "-", true, false, false);
-               va.addValidation(OperatorType.LESS_THAN,   "2004/03/02", null,       ErrorStyle.WARNING, "Less than 3/2/2004", "-", true, true, false);
-               va.addValidation(OperatorType.GREATER_OR_EQUAL, "2004/03/02", null,       ErrorStyle.STOP, "Greater than or equal to 3/2/2004", "Error box type = STOP", true, false, true);
-               va.addValidation(OperatorType.LESS_OR_EQUAL, "2004/03/04", null,       ErrorStyle.STOP, "Less than or equal to 3/4/2004", "-", false, true, false);
-
-               // "Time" validation type
-               wf.createDVTypeRow("Time ( cells are already formated as time - h:mm)");
-               wf.createHeaderRow();
-
-               va = wf.createValidationAdder(cellStyle_time, ValidationType.TIME);
-               va.addValidation(OperatorType.BETWEEN,     "12:00", "16:00", ErrorStyle.STOP, "Between 12:00 and 16:00 ", "Error box type = STOP", true, true, true);
-               va.addValidation(OperatorType.NOT_BETWEEN, "12:00", "16:00", ErrorStyle.INFO, "Not between 12:00 and 16:00 ", "Error box type = INFO", false, true, true);
-               va.addValidation(OperatorType.EQUAL,       "13:35", null,    ErrorStyle.WARNING, "Equal to 13:35", "Error box type = WARNING", false, false, true);
-               va.addValidation(OperatorType.NOT_EQUAL,   "13:35", null,    ErrorStyle.WARNING, "Not equal to 13:35", "-", false, false, false);
-               va.addValidation(OperatorType.GREATER_THAN,"12:00", null,    ErrorStyle.WARNING, "Greater than 12:00", "-", true, false, false);
-               va.addValidation(OperatorType.LESS_THAN,   "=1/2", null,    ErrorStyle.WARNING, "Less than (1/2) -> 12:00", "-", true, true, false);
-               va.addValidation(OperatorType.GREATER_OR_EQUAL, "14:00", null,    ErrorStyle.STOP, "Greater than or equal to 14:00", "Error box type = STOP", true, false, true);
-               va.addValidation(OperatorType.LESS_OR_EQUAL,"14:00", null,    ErrorStyle.STOP, "Less than or equal to 14:00", "-", false, true, false);
-       }
-
-       private static void addTextLengthValidations(WorkbookFormatter wf) {
-               wf.createSheet("Text lengths");
-               wf.createHeaderRow();
-
-               ValidationAdder va = wf.createValidationAdder(null, ValidationType.TEXT_LENGTH);
-               va.addValidation(OperatorType.BETWEEN, "2", "6", ErrorStyle.STOP, "Between 2 and 6 ", "Error box type = STOP", true, true, true);
-               va.addValidation(OperatorType.NOT_BETWEEN, "2", "6", ErrorStyle.INFO, "Not between 2 and 6 ", "Error box type = INFO", false, true, true);
-               va.addValidation(OperatorType.EQUAL, "3", null, ErrorStyle.WARNING, "Equal to 3", "Error box type = WARNING", false, false, true);
-               va.addValidation(OperatorType.NOT_EQUAL, "3", null, ErrorStyle.WARNING, "Not equal to 3", "-", false, false, false);
-               va.addValidation(OperatorType.GREATER_THAN, "3", null, ErrorStyle.WARNING, "Greater than 3", "-", true, false, false);
-               va.addValidation(OperatorType.LESS_THAN, "3", null, ErrorStyle.WARNING, "Less than 3", "-", true, true, false);
-               va.addValidation(OperatorType.GREATER_OR_EQUAL, "4", null, ErrorStyle.STOP, "Greater than or equal to 4", "Error box type = STOP", true, false, true);
-               va.addValidation(OperatorType.LESS_OR_EQUAL, "4", null, ErrorStyle.STOP, "Less than or equal to 4", "-", false, true, false);
-       }
-
-       @Test
-       void testDataValidation() throws Exception {
-               log("\nTest no. 2 - Test Excel's Data validation mechanism");
-               Workbook wb = _testDataProvider.createWorkbook();
-               WorkbookFormatter wf = new WorkbookFormatter(wb);
-
-               log("    Create sheet for Data Validation's number types ... ");
-               addSimpleNumericValidations(wf);
-               log("done !");
-
-               log("    Create sheet for 'List' Data Validation type ... ");
-               addListValidations(wf, wb);
-               log("done !");
-
-               log("    Create sheet for 'Date' and 'Time' Data Validation types ... ");
-               addDateTimeValidations(wf, wb);
-               log("done !");
-
-               log("    Create sheet for 'Text length' Data Validation type... ");
-               addTextLengthValidations(wf);
-               log("done !");
-
-               // Custom Validation type
-               log("    Create sheet for 'Custom' Data Validation type ... ");
-               addCustomValidations(wf);
-               log("done !");
-
-        _testDataProvider.writeOutAndReadBack(wb).close();
-
-        wb.close();
-       }
-
-
-
-  /* package */ static void setCellValue(Cell cell, String text) {
-         cell.setCellValue(text);
-
-      }
+    private static void addListValidations(WorkbookFormatter wf, Workbook wb) {
+        final String cellStrValue
+            = "a b c d e f g h i j k l m n o p r s t u v x y z w 0 1 2 3 4 "
+            + "a b c d e f g h i j k l m n o p r s t u v x y z w 0 1 2 3 4 "
+            + "a b c d e f g h i j k l m n o p r s t u v x y z w 0 1 2 3 4 "
+            + "a b c d e f g h i j k l m n o p r s t u v x y z w 0 1 2 3 4 ";
+        final String dataSheetName = "list_data";
+        // "List" Data Validation type
+        Sheet fSheet = wf.createSheet("Lists");
+        Sheet dataSheet = wb.createSheet(dataSheetName);
+
+
+        wf.createDVTypeRow("Explicit lists - list items are explicitly provided");
+        wf.createDVDescriptionRow("Disadvantage - sum of item's length should be less than 255 characters");
+        wf.createHeaderRow();
+
+        ValidationAdder va = wf.createValidationAdder(null, ValidationType.LIST);
+        String listValsDescr = "POIFS,HSSF,HWPF,HPSF";
+        String[] listVals = listValsDescr.split(",");
+        va.addListValidation(listVals, null, listValsDescr, false, false);
+        va.addListValidation(listVals, null, listValsDescr, false, true);
+        va.addListValidation(listVals, null, listValsDescr, true, false);
+        va.addListValidation(listVals, null, listValsDescr, true, true);
+
+
+        wf.createDVTypeRow("Reference lists - list items are taken from others cells");
+        wf.createDVDescriptionRow("Advantage - no restriction regarding the sum of item's length");
+        wf.createHeaderRow();
+        va = wf.createValidationAdder(null, ValidationType.LIST);
+        String strFormula = "$A$30:$A$39";
+        va.addListValidation(null, strFormula, strFormula, false, false);
+
+        strFormula = dataSheetName + "!$A$1:$A$10";
+        va.addListValidation(null, strFormula, strFormula, false, false);
+        Name namedRange = wb.createName();
+        namedRange.setNameName("myName");
+        namedRange.setRefersToFormula(dataSheetName + "!$A$2:$A$7");
+        strFormula = "myName";
+        va.addListValidation(null, strFormula, strFormula, false, false);
+        strFormula = "offset(myName, 2, 1, 4, 2)"; // Note about last param '2':
+        // - Excel expects single row or single column when entered in UI, but process this OK otherwise
+        va.addListValidation(null, strFormula, strFormula, false, false);
+
+        // add list data on same sheet
+        for (int i = 0; i < 10; i++) {
+            Row currRow = fSheet.createRow(i + 29);
+            setCellValue(currRow.createCell(0), cellStrValue);
+        }
+        // add list data on another sheet
+        for (int i = 0; i < 10; i++) {
+            Row currRow = dataSheet.createRow(i + 0);
+            setCellValue(currRow.createCell(0), "Data a" + i);
+            setCellValue(currRow.createCell(1), "Data b" + i);
+            setCellValue(currRow.createCell(2), "Data c" + i);
+        }
+    }
+
+    private static void addDateTimeValidations(WorkbookFormatter wf, Workbook wb) {
+        wf.createSheet("Dates and Times");
+
+        DataFormat dataFormat = wb.createDataFormat();
+        short fmtDate = dataFormat.getFormat("m/d/yyyy");
+        short fmtTime = dataFormat.getFormat("h:mm");
+        CellStyle cellStyle_date = wb.createCellStyle();
+        cellStyle_date.setDataFormat(fmtDate);
+        CellStyle cellStyle_time = wb.createCellStyle();
+        cellStyle_time.setDataFormat(fmtTime);
+
+        wf.createDVTypeRow("Date ( cells are already formated as date - m/d/yyyy)");
+        wf.createHeaderRow();
+
+        ValidationAdder va = wf.createValidationAdder(cellStyle_date, ValidationType.DATE);
+        va.addValidation(OperatorType.BETWEEN, "2004/01/02", "2004/01/06", ErrorStyle.STOP, "Between 1/2/2004 and 1/6/2004 ", "Error box type = STOP", true, true, true);
+        va.addValidation(OperatorType.NOT_BETWEEN, "2004/01/01", "2004/01/06", ErrorStyle.INFO, "Not between 1/2/2004 and 1/6/2004 ", "Error box type = INFO", false, true, true);
+        va.addValidation(OperatorType.EQUAL, "2004/03/02", null, ErrorStyle.WARNING, "Equal to 3/2/2004", "Error box type = WARNING", false, false, true);
+        va.addValidation(OperatorType.NOT_EQUAL, "2004/03/02", null, ErrorStyle.WARNING, "Not equal to 3/2/2004", "-", false, false, false);
+        va.addValidation(OperatorType.GREATER_THAN, "=DATEVALUE(\"4-Jul-2001\")", null, ErrorStyle.WARNING, "Greater than DATEVALUE('4-Jul-2001')", "-", true, false, false);
+        va.addValidation(OperatorType.LESS_THAN, "2004/03/02", null, ErrorStyle.WARNING, "Less than 3/2/2004", "-", true, true, false);
+        va.addValidation(OperatorType.GREATER_OR_EQUAL, "2004/03/02", null, ErrorStyle.STOP, "Greater than or equal to 3/2/2004", "Error box type = STOP", true, false, true);
+        va.addValidation(OperatorType.LESS_OR_EQUAL, "2004/03/04", null, ErrorStyle.STOP, "Less than or equal to 3/4/2004", "-", false, true, false);
+
+        // "Time" validation type
+        wf.createDVTypeRow("Time ( cells are already formated as time - h:mm)");
+        wf.createHeaderRow();
+
+        va = wf.createValidationAdder(cellStyle_time, ValidationType.TIME);
+        va.addValidation(OperatorType.BETWEEN, "12:00", "16:00", ErrorStyle.STOP, "Between 12:00 and 16:00 ", "Error box type = STOP", true, true, true);
+        va.addValidation(OperatorType.NOT_BETWEEN, "12:00", "16:00", ErrorStyle.INFO, "Not between 12:00 and 16:00 ", "Error box type = INFO", false, true, true);
+        va.addValidation(OperatorType.EQUAL, "13:35", null, ErrorStyle.WARNING, "Equal to 13:35", "Error box type = WARNING", false, false, true);
+        va.addValidation(OperatorType.NOT_EQUAL, "13:35", null, ErrorStyle.WARNING, "Not equal to 13:35", "-", false, false, false);
+        va.addValidation(OperatorType.GREATER_THAN, "12:00", null, ErrorStyle.WARNING, "Greater than 12:00", "-", true, false, false);
+        va.addValidation(OperatorType.LESS_THAN, "=1/2", null, ErrorStyle.WARNING, "Less than (1/2) -> 12:00", "-", true, true, false);
+        va.addValidation(OperatorType.GREATER_OR_EQUAL, "14:00", null, ErrorStyle.STOP, "Greater than or equal to 14:00", "Error box type = STOP", true, false, true);
+        va.addValidation(OperatorType.LESS_OR_EQUAL, "14:00", null, ErrorStyle.STOP, "Less than or equal to 14:00", "-", false, true, false);
+    }
+
+    private static void addTextLengthValidations(WorkbookFormatter wf) {
+        wf.createSheet("Text lengths");
+        wf.createHeaderRow();
+
+        ValidationAdder va = wf.createValidationAdder(null, ValidationType.TEXT_LENGTH);
+        va.addValidation(OperatorType.BETWEEN, "2", "6", ErrorStyle.STOP, "Between 2 and 6 ", "Error box type = STOP", true, true, true);
+        va.addValidation(OperatorType.NOT_BETWEEN, "2", "6", ErrorStyle.INFO, "Not between 2 and 6 ", "Error box type = INFO", false, true, true);
+        va.addValidation(OperatorType.EQUAL, "3", null, ErrorStyle.WARNING, "Equal to 3", "Error box type = WARNING", false, false, true);
+        va.addValidation(OperatorType.NOT_EQUAL, "3", null, ErrorStyle.WARNING, "Not equal to 3", "-", false, false, false);
+        va.addValidation(OperatorType.GREATER_THAN, "3", null, ErrorStyle.WARNING, "Greater than 3", "-", true, false, false);
+        va.addValidation(OperatorType.LESS_THAN, "3", null, ErrorStyle.WARNING, "Less than 3", "-", true, true, false);
+        va.addValidation(OperatorType.GREATER_OR_EQUAL, "4", null, ErrorStyle.STOP, "Greater than or equal to 4", "Error box type = STOP", true, false, true);
+        va.addValidation(OperatorType.LESS_OR_EQUAL, "4", null, ErrorStyle.STOP, "Less than or equal to 4", "-", false, true, false);
+    }
+
+    @Test
+    void testDataValidation() throws Exception {
+        try (Workbook wb1 = _testDataProvider.createWorkbook()) {
+            WorkbookFormatter wf1 = new WorkbookFormatter(wb1);
+            addSimpleNumericValidations(wf1);
+            addListValidations(wf1, wb1);
+            addDateTimeValidations(wf1, wb1);
+            addTextLengthValidations(wf1);
+            // Custom Validation type
+            addCustomValidations(wf1);
+            try (Workbook wb2 = _testDataProvider.writeOutAndReadBack(wb1)) {
+                               Sheet sh = wb2.getSheet("Numbers");
+                               assertEquals(16, sh.getDataValidations().size());
+            }
+
+        }
+    }
+
+
+    static void setCellValue(Cell cell, String text) {
+        cell.setCellValue(text);
+    }
 
 }
\ No newline at end of file
index 5715ab0cc9e4931cbd62a4c791a910921afedb66..60a676fc7b0967886ff6d23c5cee37025caab0e8 100644 (file)
@@ -17,6 +17,7 @@
 
 package org.apache.poi.ss.usermodel;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -25,21 +26,17 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.List;
 
-import org.apache.poi.hssf.HSSFITestDataProvider;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.ITestDataProvider;
 import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.util.CellReference;
-import org.apache.poi.util.IOUtils;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 /**
  * Tests of implementations of {@link org.apache.poi.ss.usermodel.Name}.
- *
- * @author Yegor Kozlov
  */
 public abstract class BaseTestNamedRange {
 
@@ -103,13 +100,13 @@ public abstract class BaseTestNamedRange {
 
     @Test
     public final void testUnicodeNamedRange() throws Exception {
-        try (HSSFWorkbook wb1 = new HSSFWorkbook()) {
+        try (Workbook wb1 = _testDataProvider.createWorkbook()) {
             wb1.createSheet("Test");
             Name name = wb1.createName();
             name.setNameName("\u03B1");
             name.setRefersToFormula("Test!$D$3:$E$8");
 
-            try (HSSFWorkbook wb2 = HSSFITestDataProvider.instance.writeOutAndReadBack(wb1)) {
+            try (Workbook wb2 = _testDataProvider.writeOutAndReadBack(wb1)) {
                 Name name2 = wb2.getName("\u03B1");
 
                 assertNotNull(name2);
@@ -637,71 +634,64 @@ public abstract class BaseTestNamedRange {
 
     // bug 56781: name validation only checks for first character's validity and presence of spaces
     // bug 60246: validate name does not allow DOT in named ranges
-    @Test
-    void testValid() throws IOException {
-        Workbook wb = _testDataProvider.createWorkbook();
-
-        Name name = wb.createName();
-        for (String valid : Arrays.asList(
-                "Hello",
-                "number1",
-                "_underscore",
-                "underscore_",
-                "p.e.r.o.i.d.s",
-                "\\Backslash",
-                "Backslash\\"
-                )) {
-            name.setNameName(valid);
+    @ParameterizedTest
+    @ValueSource(strings = {"Hello", "number1", "_underscore", "underscore_", "p.e.r.o.i.d.s", "\\Backslash", "Backslash\\"})
+    void testValid(String valid) throws IOException {
+        try (Workbook wb = _testDataProvider.createWorkbook()) {
+            Name name = wb.createName();
+            assertDoesNotThrow(() -> name.setNameName(valid));
         }
-
-        wb.close();
     }
 
-    @Test
-    void testInvalid() {
+    @ParameterizedTest
+    @ValueSource(strings = {
+        "1number", "Sheet1!A1", "Exclamation!", "Has Space", "Colon:", "A-Minus", "A+Plus", "Dollar$", ".periodAtBeginning",
+        //special shorthand
+        "R", "C",
+        // A1-style cell reference
+        "A1",
+        // R1C1-style cell reference
+        "R1C1",
+        "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters..."+
+        "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters..."+
+        "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters..."+
+        "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters..."+
+        "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters"
+    })
+    void testInvalid(String invalid) {
         Workbook wb = _testDataProvider.createWorkbook();
 
         Name name = wb.createName();
-        IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> name.setNameName(""));
+        IllegalArgumentException e;
+        e = assertThrows(IllegalArgumentException.class, () -> name.setNameName(""));
         assertEquals("Name cannot be blank", e.getMessage());
 
-        for (String invalid : Arrays.asList(
-            "1number",
-            "Sheet1!A1",
-            "Exclamation!",
-            "Has Space",
-            "Colon:",
-            "A-Minus",
-            "A+Plus",
-            "Dollar$",
-            ".periodAtBeginning",
-            "R", //special shorthand
-            "C", //special shorthand
-            "A1", // A1-style cell reference
-            "R1C1", // R1C1-style cell reference
-            "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters..."+
-            "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters..."+
-            "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters..."+
-            "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters..."+
-            "NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters.NameThatIsLongerThan255Characters"
-        )) {
-            e = assertThrows(IllegalArgumentException.class, () -> name.setNameName(invalid));
-            assertTrue(e.getMessage().startsWith("Invalid name: '"+invalid+"'"));
-        }
-
+        e = assertThrows(IllegalArgumentException.class, () -> name.setNameName(invalid));
+        assertTrue(e.getMessage().startsWith("Invalid name: '"+invalid+"'"));
     }
 
     // bug 60260: renaming a sheet with a named range referring to a unicode (non-ASCII) sheet name
     @Test
-    void renameSheetWithNamedRangeReferringToUnicodeSheetName() {
-        Workbook wb = _testDataProvider.createWorkbook();
-        wb.createSheet("Sheet\u30FB1");
+    void renameSheetWithNamedRangeReferringToUnicodeSheetName() throws IOException {
+        String unicodeName = "Sheet\u30FB201";
+        String asciiName = "Sheet 1";
+        String rangeName = "test_named_range";
+        try (Workbook wb1 = _testDataProvider.createWorkbook()) {
+            wb1.createSheet(unicodeName);
 
-        Name name = wb.createName();
-        name.setNameName("test_named_range");
-        name.setRefersToFormula("'Sheet\u30FB201'!A1:A6");
+            Name name1 = wb1.createName();
+            name1.setNameName(rangeName);
+            name1.setRefersToFormula("'"+unicodeName+"'!A1:A6");
 
-        wb.setSheetName(0, "Sheet 1");
-        IOUtils.closeQuietly(wb);
+            wb1.setSheetName(0, asciiName);
+            assertEquals(asciiName, name1.getSheetName());
+
+            try (Workbook wb2 = _testDataProvider.writeOutAndReadBack(wb1)) {
+                Name name2 = wb2.getName(rangeName);
+                assertNotNull(name2);
+                // Eventually this will be updated, but currently we don't update the sheet name
+                assertEquals(asciiName, name2.getSheetName());
+            }
+         }
     }
 }
index 3a722b02ca8f240055b6206bd6573090d71a13e6..947bd71a9f74a1facabf6a354e983f5742f1ec47 100644 (file)
@@ -18,6 +18,7 @@
 package org.apache.poi.ss.usermodel;
 
 import static org.apache.poi.POITestCase.assertBetween;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -39,6 +40,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.poi.common.usermodel.HyperlinkType;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.ITestDataProvider;
 import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.util.CellAddress;
@@ -1039,7 +1041,7 @@ public abstract class BaseTestSheet {
 
             // here we can only verify that setting some zoom values works,
             // range-checking is different between the implementations
-            sheet.setZoom(75);
+            assertDoesNotThrow(() -> sheet.setZoom(75));
         }
     }
 
@@ -1048,6 +1050,10 @@ public abstract class BaseTestSheet {
         try (Workbook wb = _testDataProvider.createWorkbook()) {
             Sheet sheet = wb.createSheet();
             sheet.showInPane(2, 3);
+            if (wb instanceof HSSFWorkbook) {
+                assertEquals(2, sheet.getTopRow());
+                assertEquals(3, sheet.getLeftCol());
+            }
         }
     }
 
index 00697bbdb44642a326153f37fbef79d18f768a04..befe219a1657668cba4636ac263f8e792f037486 100644 (file)
@@ -22,22 +22,24 @@ package org.apache.poi.ss.util;
 import static java.text.DateFormat.getDateInstance;
 import static java.text.DateFormat.getDateTimeInstance;
 import static java.text.DateFormat.getTimeInstance;
+import static org.apache.poi.ss.util.DateFormatConverter.getPrefixForLocale;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import java.io.File;
-import java.io.FileOutputStream;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.Locale;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -49,7 +51,6 @@ import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.util.LocaleID;
 import org.apache.poi.util.NullOutputStream;
-import org.apache.poi.util.TempFile;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.CsvSource;
@@ -74,50 +75,54 @@ final class TestDateFormatConverter {
         "false, true, " + DateFormat.FULL + ", Full"
     })
     void testJavaDateFormatsInExcel(boolean dates, boolean times, int style, String styleName ) throws Exception {
+        String sheetName = (dates) ? ((times) ? "DateTimes" : "Dates") : "Times";
+        String[] headers = {
+            "locale", "DisplayName", "Excel " + styleName, "java.text.DateFormat",
+            "Equals", "Java pattern", "Excel pattern"
+        };
+
+        Locale[] locales = Arrays.stream(DateFormat.getAvailableLocales())
+            // only use locale with known LocaleIDs
+            .filter(l -> !getPrefixForLocale(l).isEmpty() || Locale.ROOT.equals(l) || l.toLanguageTag().isEmpty())
+            .sorted(Comparator.comparing(Locale::toString))
+            .toArray(Locale[]::new);
+
+
         try (Workbook workbook = new HSSFWorkbook()) {
-            String sheetName = (dates) ? ((times) ? "DateTimes" : "Dates") : "Times";
             Sheet sheet = workbook.createSheet(sheetName);
             Row header = sheet.createRow(0);
-            header.createCell(0).setCellValue("locale");
-            header.createCell(1).setCellValue("DisplayName");
-            header.createCell(2).setCellValue("Excel " + styleName);
-            header.createCell(3).setCellValue("java.text.DateFormat");
-            header.createCell(4).setCellValue("Equals");
-            header.createCell(5).setCellValue("Java pattern");
-            header.createCell(6).setCellValue("Excel pattern");
+            IntStream.range(0, headers.length).forEach(i -> header.createCell(i).setCellValue(headers[i]));
 
             int rowNum = 1;
-            for (Locale locale : DateFormat.getAvailableLocales()) {
-                Row row = sheet.createRow(rowNum++);
-
-                row.createCell(0).setCellValue(locale.toString());
-                row.createCell(1).setCellValue(locale.getDisplayName(Locale.ROOT));
+            final Cell[] cell = new Cell[7];
+            final Date date = new Date();
 
+            for (Locale locale : locales) {
                 DateFormat dateFormat = (dates)
                     ? (times ? getDateTimeInstance(style, style, locale) : getDateInstance(style, locale))
                     : getTimeInstance(style, locale);
-
-                Cell cell = row.createCell(2);
-                Date date = new Date();
-                cell.setCellValue(date);
-                CellStyle cellStyle = row.getSheet().getWorkbook().createCellStyle();
-
                 String javaDateFormatPattern = ((SimpleDateFormat) dateFormat).toPattern();
                 String excelFormatPattern = DateFormatConverter.convert(locale, javaDateFormatPattern);
 
-                DataFormat poiFormat = row.getSheet().getWorkbook().createDataFormat();
+                Row row = sheet.createRow(rowNum++);
+                IntStream.range(0, headers.length).forEach(i -> cell[i] = row.createCell(i));
+                CellStyle cellStyle = workbook.createCellStyle();
+                DataFormat poiFormat = workbook.createDataFormat();
                 cellStyle.setDataFormat(poiFormat.getFormat(excelFormatPattern));
-                row.createCell(3).setCellValue(dateFormat.format(date));
 
-                cell.setCellStyle(cellStyle);
+                cell[0].setCellValue(locale.toString());
+                cell[1].setCellValue(locale.getDisplayName(Locale.ROOT));
+                cell[2].setCellValue(date);
+                cell[2].setCellStyle(cellStyle);
+                cell[3].setCellValue(dateFormat.format(date));
 
                 // the formula returns TRUE is the formatted date in column C equals to the string in column D
-                row.createCell(4).setCellFormula("TEXT(C" + rowNum + ",G" + rowNum + ")=D" + rowNum);
-                row.createCell(5).setCellValue(javaDateFormatPattern);
-                row.createCell(6).setCellValue(excelFormatPattern);
+                cell[4].setCellFormula("TEXT(C" + rowNum + ",G" + rowNum + ")=D" + rowNum);
+                cell[5].setCellValue(javaDateFormatPattern);
+                cell[6].setCellValue(excelFormatPattern);
             }
 
-            workbook.write(new NullOutputStream());
+            assertDoesNotThrow(() -> workbook.write(new NullOutputStream()));
         }
     }
 
@@ -125,7 +130,7 @@ final class TestDateFormatConverter {
     void testJDK8EmptyLocale() {
         // JDK 8 seems to add an empty locale-string to the list returned via DateFormat.getAvailableLocales()
         // therefore we now cater for this special locale as well
-        String prefix = DateFormatConverter.getPrefixForLocale(new Locale(""));
+        String prefix = getPrefixForLocale(new Locale(""));
         assertEquals("", prefix);
     }
 
@@ -163,7 +168,7 @@ final class TestDateFormatConverter {
                     continue;
                 }
 
-                String prefix = DateFormatConverter.getPrefixForLocale(loc);
+                String prefix = getPrefixForLocale(loc);
                 assertNotNull(prefix, "Prefix not found - language tag: "+partTag);
                 assertNotEquals("", prefix, "Prefix not found - language tag: "+partTag);
                 Matcher m = p.matcher(prefix);