Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBorderFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBorderFormatting.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBorderFormatting.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBorderFormatting.java
 Mon Sep 19 00:20:44 2016
@@ -35,32 +35,87 @@ public class XSSFBorderFormatting implem
         _border = border;
     }
 
+    /**
+     * @deprecated POI 3.15. Use {@link #getBorderBottomEnum()}.
+     * This method will return an BorderStyle enum in the future.
+     */
     @Override
-    public BorderStyle getBorderBottom() {
+    public short getBorderBottom() {
+        return getBorderBottomEnum().getCode();
+    }
+    /**
+     * @since POI 3.15
+     */
+    @Override
+    public BorderStyle getBorderBottomEnum() {
         STBorderStyle.Enum ptrn = _border.isSetBottom() ? 
_border.getBottom().getStyle() : null;
         return ptrn == null ? BorderStyle.NONE : 
BorderStyle.valueOf((short)(ptrn.intValue() - 1));
     }
 
+    /**
+     * @deprecated POI 3.15. Use {@link #getBorderDiagonalEnum()}.
+     * This method will return an BorderStyle enum in the future.
+     */
     @Override
-    public BorderStyle getBorderDiagonal() {
+    public short getBorderDiagonal() {
+        return getBorderDiagonalEnum().getCode();
+    }
+    /**
+     * @since POI 3.15
+     */
+    @Override
+    public BorderStyle getBorderDiagonalEnum() {
         STBorderStyle.Enum ptrn = _border.isSetDiagonal() ? 
_border.getDiagonal().getStyle() : null;
         return ptrn == null ? BorderStyle.NONE : 
BorderStyle.valueOf((short)(ptrn.intValue() - 1));
     }
 
+    /**
+     * @deprecated POI 3.15. Use {@link #getBorderLeftEnum()}.
+     * This method will return an BorderStyle enum in the future.
+     */
+    @Override
+    public short getBorderLeft() {
+        return getBorderLeftEnum().getCode();
+    }
+    /**
+     * @since POI 3.15
+     */
     @Override
-    public BorderStyle getBorderLeft() {
+    public BorderStyle getBorderLeftEnum() {
         STBorderStyle.Enum ptrn = _border.isSetLeft() ? 
_border.getLeft().getStyle() : null;
         return ptrn == null ? BorderStyle.NONE : 
BorderStyle.valueOf((short)(ptrn.intValue() - 1));
     }
 
+    /**
+     * @deprecated POI 3.15. Use {@link #getBorderRightEnum()}.
+     * This method will return an BorderStyle enum in the future.
+     */
+    @Override
+    public short getBorderRight() {
+        return getBorderRightEnum().getCode();
+    }
+    /**
+     * @since POI 3.15
+     */
     @Override
-    public BorderStyle getBorderRight() {
+    public BorderStyle getBorderRightEnum() {
         STBorderStyle.Enum ptrn = _border.isSetRight() ? 
_border.getRight().getStyle() : null;
         return ptrn == null ? BorderStyle.NONE : 
BorderStyle.valueOf((short)(ptrn.intValue() - 1));
     }
 
+    /**
+     * @deprecated POI 3.15. Use {@link #getBorderTopEnum()}.
+     * This method will return an BorderStyle enum in the future.
+     */
+    @Override
+    public short getBorderTop() {
+        return getBorderTopEnum().getCode();
+    }
+    /**
+     * @since POI 3.15
+     */
     @Override
-    public BorderStyle getBorderTop() {
+    public BorderStyle getBorderTopEnum() {
         STBorderStyle.Enum ptrn = _border.isSetTop() ? 
_border.getTop().getStyle() : null;
         return ptrn == null ? BorderStyle.NONE : 
BorderStyle.valueOf((short)(ptrn.intValue() - 1));
     }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
 Mon Sep 19 00:20:44 2016
@@ -668,6 +668,7 @@ public final class XSSFCell implements C
      * For forwards compatibility, do not hard-code cell type literals in your 
code.
      *
      * @return the cell type
+     * @deprecated 3.15. Will return a {@link CellType} enum in the future.
      */
     @Override
     public int getCellType() {
@@ -699,6 +700,7 @@ public final class XSSFCell implements C
      * @return one of ({@link CellType#NUMERIC}, {@link CellType#STRING},
      *     {@link CellType#BOOLEAN}, {@link CellType#ERROR}) depending
      * on the cached value of the formula
+     * @deprecated 3.15. Will return a {@link CellType} enum in the future.
      */
     @Override
     public int getCachedFormulaResultType() {
@@ -714,7 +716,6 @@ public final class XSSFCell implements C
      * @deprecated POI 3.15 beta 3
      * Will be deleted when we make the CellType enum transition. See bug 
59791.
      */
-    @Internal(since="POI 3.15 beta 3")
     @Override
     public CellType getCachedFormulaResultTypeEnum() {
         if (! isFormulaCell()) {
@@ -826,7 +827,7 @@ public final class XSSFCell implements C
      * @throws IllegalStateException if the cell type returned by {@link 
#getCellTypeEnum()} isn't {@link CellType#ERROR}
      * @see FormulaError
      */
-    public String getErrorCellString() {
+    public String getErrorCellString() throws IllegalStateException {
         CellType cellType = getBaseCellType(true);
         if(cellType != CellType.ERROR) throw typeMismatch(CellType.ERROR, 
cellType, false);
 
@@ -844,13 +845,16 @@ public final class XSSFCell implements C
      * @see FormulaError
      */
     @Override
-    public byte getErrorCellValue() {
+    public byte getErrorCellValue() throws IllegalStateException {
         String code = getErrorCellString();
         if (code == null) {
             return 0;
         }
-
-        return FormulaError.forString(code).getCode();
+        try {
+            return FormulaError.forString(code).getCode();
+        } catch (final IllegalArgumentException e) {
+            throw new IllegalStateException("Unexpected error code", e);
+        }
     }
 
     /**

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java
 Mon Sep 19 00:20:44 2016
@@ -28,6 +28,7 @@ import org.apache.poi.ss.usermodel.Horiz
 import org.apache.poi.ss.usermodel.IndexedColors;
 import org.apache.poi.ss.usermodel.VerticalAlignment;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.Removal;
 import org.apache.poi.xssf.model.StylesTable;
 import org.apache.poi.xssf.model.ThemesTable;
 import org.apache.poi.xssf.usermodel.extensions.XSSFCellAlignment;
@@ -251,11 +252,13 @@ public class XSSFCellStyle implements Ce
 
     /**
      * Get the type of border to use for the bottom border of the cell
+     * Will be removed when {@link #getBorderBottom()} returns a BorderStyle 
enum
      *
      * @return border type, default value is {@link 
org.apache.poi.ss.usermodel.BorderStyle#NONE}
+     * @since POI 3.15
      */
     @Override
-    public BorderStyle getBorderBottom() {
+    public BorderStyle getBorderBottomEnum() {
         if(!_cellXf.getApplyBorder()) return BorderStyle.NONE;
 
         int idx = (int)_cellXf.getBorderId();
@@ -266,24 +269,26 @@ public class XSSFCellStyle implements Ce
         }
         return BorderStyle.valueOf((short)(ptrn.intValue() - 1));
     }
-
     /**
      * Get the type of border to use for the bottom border of the cell
+     * This will return a BorderStyle enum in the future.
      *
-     * @return border type as Java enum
-     * @deprecated 3.15 beta 2. Use {@link #getBorderBottom}
+     * @return border type code
+     * @deprecated 3.15 beta 2. Use {@link #getBorderBottomEnum()}
      */
-    public BorderStyle getBorderBottomEnum() {
-        return getBorderBottom();
+    public short getBorderBottom() {
+        return getBorderBottomEnum().getCode();
     }
 
     /**
      * Get the type of border to use for the left border of the cell
+     * Will be removed when {@link #getBorderLeft()} returns a BorderStyle enum
      *
      * @return border type, default value is {@link 
org.apache.poi.ss.usermodel.BorderStyle#NONE}
+     * @since POI 3.15
      */
     @Override
-    public BorderStyle getBorderLeft() {
+    public BorderStyle getBorderLeftEnum() {
         if(!_cellXf.getApplyBorder()) return BorderStyle.NONE;
 
         int idx = (int)_cellXf.getBorderId();
@@ -297,21 +302,24 @@ public class XSSFCellStyle implements Ce
 
     /**
      * Get the type of border to use for the left border of the cell
+     * This will return a BorderStyle enum in the future.
      *
-     * @return border type, default value is {@link 
org.apache.poi.ss.usermodel.BorderStyle#NONE}
-     * @deprecated 3.15 beta 2. Use {@link #getBorderLeft}
+     * @return border type code
+     * @deprecated 3.15 beta 2. Use {@link #getBorderLeftEnum()}
      */
-    public BorderStyle getBorderLeftEnum() {
-        return getBorderLeft();
+    public short getBorderLeft() {
+        return getBorderLeftEnum().getCode();
     }
 
     /**
      * Get the type of border to use for the right border of the cell
+     * Will be removed when {@link #getBorderRight()} returns a BorderStyle 
enum
      *
      * @return border type, default value is {@link 
org.apache.poi.ss.usermodel.BorderStyle#NONE}
+     * @since POI 3.15
      */
     @Override
-    public BorderStyle getBorderRight() {
+    public BorderStyle getBorderRightEnum() {
         if(!_cellXf.getApplyBorder()) return BorderStyle.NONE;
 
         int idx = (int)_cellXf.getBorderId();
@@ -322,24 +330,26 @@ public class XSSFCellStyle implements Ce
         }
         return BorderStyle.valueOf((short)(ptrn.intValue() - 1));
     }
-
     /**
      * Get the type of border to use for the right border of the cell
+     * This will return a BorderStyle enum in the future.
      *
      * @return border type, default value is {@link 
org.apache.poi.ss.usermodel.BorderStyle#NONE}
-     * @deprecated 3.15 beta 2. Use {@link #getBorderRight}
+     * @deprecated 3.15 beta 2. Use {@link #getBorderRightEnum()} instead
      */
-    public BorderStyle getBorderRightEnum() {
-        return getBorderRight();
+    public short getBorderRight() {
+        return getBorderRightEnum().getCode();
     }
 
     /**
      * Get the type of border to use for the top border of the cell
+     * Will be removed when {@link #getBorderTop()} returns a BorderStyle enum
      *
      * @return border type, default value is {@link 
org.apache.poi.ss.usermodel.BorderStyle#NONE}
+     * @since POI 3.15
      */
     @Override
-    public BorderStyle getBorderTop() {
+    public BorderStyle getBorderTopEnum() {
         if(!_cellXf.getApplyBorder()) return BorderStyle.NONE;
 
         int idx = (int)_cellXf.getBorderId();
@@ -350,15 +360,15 @@ public class XSSFCellStyle implements Ce
         }
         return BorderStyle.valueOf((short) (ptrn.intValue() - 1));
     }
-
      /**
      * Get the type of border to use for the top border of the cell
+     * This will return a BorderStyle enum in the future.
      *
      * @return border type, default value is {@link 
org.apache.poi.ss.usermodel.BorderStyle#NONE}
-     * @deprecated 3.15 beta 2. Use {@link #getBorderTop}
+     * @deprecated 3.15 beta 2. Use {@link #getBorderTopEnum()} instead.
      */
-    public BorderStyle getBorderTopEnum() {
-         return getBorderTop();
+    public short getBorderTop() {
+         return getBorderTopEnum().getCode();
     }
 
     /**
@@ -775,6 +785,7 @@ public class XSSFCellStyle implements Ce
      * @see org.apache.poi.ss.usermodel.CellStyle#ALIGN_CENTER_SELECTION
      * @deprecated POI 3.15 beta 3. Use {@link 
#setAlignment(HorizontalAlignment)} instead.
      */
+    @Removal(version="3.17")
     @Override
     public void setAlignment(short align) {
         setAlignment(HorizontalAlignment.forInt(align));
@@ -796,6 +807,7 @@ public class XSSFCellStyle implements Ce
      * @param border the type of border to use
      * @deprecated 3.15 beta 2. Use {@link #setBorderBottom(BorderStyle)}
      */
+    @Removal(version="3.17")
     @Override
     public void setBorderBottom(short border) {
         setBorderBottom(BorderStyle.valueOf(border));
@@ -806,6 +818,7 @@ public class XSSFCellStyle implements Ce
      *
      * @param border - type of border to use
      * @see org.apache.poi.ss.usermodel.BorderStyle
+     * @since POI 3.15
      */
     @Override
     public void setBorderBottom(BorderStyle border) {
@@ -825,6 +838,7 @@ public class XSSFCellStyle implements Ce
      * @param border the type of border to use
      * @deprecated 3.15 beta 2. Use {@link #setBorderLeft(BorderStyle)}
      */
+    @Removal(version="3.17")
     @Override
     public void setBorderLeft(short border) {
         setBorderLeft(BorderStyle.valueOf(border));
@@ -834,6 +848,7 @@ public class XSSFCellStyle implements Ce
      * Set the type of border to use for the left border of the cell
       *
      * @param border the type of border to use
+     * @since POI 3.15
      */
     @Override
     public void setBorderLeft(BorderStyle border) {
@@ -854,6 +869,7 @@ public class XSSFCellStyle implements Ce
      * @param border the type of border to use
      * @deprecated 3.15 beta 2. Use {@link #setBorderRight(BorderStyle)}
      */
+    @Removal(version="3.17")
     @Override
     public void setBorderRight(short border) {
         setBorderRight(BorderStyle.valueOf(border));
@@ -863,6 +879,7 @@ public class XSSFCellStyle implements Ce
      * Set the type of border to use for the right border of the cell
       *
      * @param border the type of border to use
+     * @since POI 3.15
      */
     @Override
     public void setBorderRight(BorderStyle border) {
@@ -883,6 +900,7 @@ public class XSSFCellStyle implements Ce
      * @param border the type of border to use
      * @deprecated 3.15 beta 2. Use {@link #setBorderTop(BorderStyle)}
      */
+    @Removal(version="3.17")
     @Override
     public void setBorderTop(short border) {
         setBorderTop(BorderStyle.valueOf(border));
@@ -892,6 +910,7 @@ public class XSSFCellStyle implements Ce
      * Set the type of border to use for the top border of the cell
      *
      * @param border the type of border to use
+     * @since POI 3.15
      */
     @Override
     public void setBorderTop(BorderStyle border) {
@@ -1121,7 +1140,9 @@ public class XSSFCellStyle implements Ce
      * @see #setFillBackgroundColor(short)
      * @see #setFillForegroundColor(short)
      * @param fp  fill pattern (set to {@link 
org.apache.poi.ss.usermodel.CellStyle#SOLID_FOREGROUND} to fill w/foreground 
color)
+     * @deprecated POI 3.15. Use {@link #setFillPattern(FillPatternType)} 
instead.
      */
+    @Removal(version="3.17")
     @Override
     public void setFillPattern(short fp) {
         setFillPattern(FillPatternType.forInt(fp));
@@ -1335,6 +1356,7 @@ public class XSSFCellStyle implements Ce
      * @see org.apache.poi.ss.usermodel.VerticalAlignment
      * @deprecated POI 3.15 beta 3. Use {@link 
#setVerticalAlignment(VerticalAlignment)} instead.
      */
+    @Removal(version="3.17")
     @Override
     public void setVerticalAlignment(short align) {
         setVerticalAlignment(VerticalAlignment.forInt(align));

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
 Mon Sep 19 00:20:44 2016
@@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel;
 
 import org.apache.poi.ss.usermodel.ClientAnchor;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.Removal;
 import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
 
 /**
@@ -218,15 +219,28 @@ public final class XSSFClientAnchor exte
     /**
      * Sets the anchor type
      * @param anchorType the anchor type to set
+     * @since POI 3.14
      */
     @Override
     public void setAnchorType( AnchorType anchorType )
     {
         this.anchorType = anchorType;
     }
+    /**
+     * Sets the anchor type
+     * @param anchorType the anchor type to set
+     * @deprecated POI 3.15. Use {@link #setAnchorType(AnchorType)} instead
+     */
+    @Removal(version="3.17")
+    @Override
+    public void setAnchorType( int anchorType )
+    {
+        this.anchorType = AnchorType.byId(anchorType);
+    }
 
     /**
      * Gets the anchor type
+     * Changed from returning an int to an enum in POI 3.14 beta 1.
      * @return the anchor type
      */
     @Override

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java
 Mon Sep 19 00:20:44 2016
@@ -20,6 +20,7 @@ import org.apache.poi.common.usermodel.H
 import org.apache.poi.ss.usermodel.CreationHelper;
 import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.Removal;
 
 public class XSSFCreationHelper implements CreationHelper {
     private final XSSFWorkbook workbook;
@@ -61,6 +62,7 @@ public class XSSFCreationHelper implemen
      * @deprecated POI 3.15 beta 3. Use {@link 
#createHyperlink(HyperlinkType)} instead.
      */
     @Deprecated
+    @Removal(version="3.17")
     @Override
     public XSSFHyperlink createHyperlink(int type) {
         return new XSSFHyperlink(type);

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationCell.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationCell.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationCell.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationCell.java
 Mon Sep 19 00:20:44 2016
@@ -58,6 +58,7 @@ final class XSSFEvaluationCell implement
         * For forwards compatibility, do not hard-code cell type literals in 
your code.
         *
         * @return cell type
+        * @deprecated 3.15. Will return a {@link CellType} enum in the future.
         */
        @Override
        public int getCellType() {
@@ -68,7 +69,6 @@ final class XSSFEvaluationCell implement
         * @deprecated POI 3.15 beta 3.
         * Will be deleted when we make the CellType enum transition. See bug 
59791.
         */
-       @Internal(since="POI 3.15 beta 3")
        @Override
        public CellType getCellTypeEnum() {
                return _cell.getCellTypeEnum();

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationSheet.java
 Mon Sep 19 00:20:44 2016
@@ -67,7 +67,28 @@ final class XSSFEvaluationSheet implemen
             }
         }
         
-        return _cellCache.get(new CellKey(rowIndex, columnIndex));
+        final CellKey key = new CellKey(rowIndex, columnIndex);
+        EvaluationCell evalcell = _cellCache.get(key);
+        
+        // If cache is stale, update cache with this one cell
+        // This is a compromise between rebuilding the entire cache
+        // (which would quickly defeat the benefit of the cache)
+        // and not caching at all.
+        // See bug 59958: Add cells on the fly to the evaluation sheet cache 
on cache miss
+        if (evalcell == null) {
+            XSSFRow row = _xs.getRow(rowIndex);
+            if (row == null) {
+                return null;
+            }
+            XSSFCell cell = row.getCell(columnIndex);
+            if (cell == null) {
+                return null;
+            }
+            evalcell = new XSSFEvaluationCell(cell, this);
+            _cellCache.put(key, evalcell);
+        }
+        
+        return evalcell;
     }
     
     private static class CellKey {

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java
 Mon Sep 19 00:20:44 2016
@@ -23,6 +23,8 @@ import org.apache.poi.ss.formula.IStabil
 import org.apache.poi.ss.formula.WorkbookEvaluator;
 import org.apache.poi.ss.formula.udf.UDFFinder;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * Evaluates formula cells.<p/>
@@ -56,27 +58,6 @@ public final class XSSFFormulaEvaluator
     }
 
     /**
-     * If cell contains formula, it evaluates the formula, and
-     *  puts the formula result back into the cell, in place
-     *  of the old formula.
-     * Else if cell does not contain formula, this method leaves
-     *  the cell unchanged.
-     * Note that the same instance of XSSFCell is returned to
-     * allow chained calls like:
-     * <pre>
-     * int evaluatedCellType = evaluator.evaluateInCell(cell).getCellType();
-     * </pre>
-     * Be aware that your cell value will be changed to hold the
-     *  result of the formula. If you simply want the formula
-     *  value computed for you, use {@link 
#evaluateFormulaCellEnum(org.apache.poi.ss.usermodel.Cell)} }
-     * @param cell
-     */
-    public XSSFCell evaluateInCell(Cell cell) {
-        doEvaluateInCell(cell);
-        return (XSSFCell)cell;
-    }
-
-    /**
      * Loops over all cells in all sheets of the supplied
      *  workbook.
      * For cells that contain formulas, their formulas are
@@ -90,6 +71,12 @@ public final class XSSFFormulaEvaluator
     public static void evaluateAllFormulaCells(XSSFWorkbook wb) {
         BaseFormulaEvaluator.evaluateAllFormulaCells(wb);
     }
+    
+    @Override
+    public XSSFCell evaluateInCell(Cell cell) {
+        return (XSSFCell) super.evaluateInCell(cell);
+    }
+    
     /**
      * Loops over all cells in all sheets of the supplied
      *  workbook.

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java
 Mon Sep 19 00:20:44 2016
@@ -168,6 +168,7 @@ public class XSSFHyperlink implements Hy
      * @return the type of this hyperlink
      * @see HyperlinkType#forInt
      * @deprecated POI 3.15 beta 3. Use {@link #getTypeEnum()} instead.
+     * getType will return a HyperlinkType enum in the future.
      */
     @Override
     public int getType() {

Propchange: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java
 Mon Sep 19 00:20:44 2016
@@ -30,6 +30,7 @@ import javax.xml.namespace.QName;
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.DataConsolidateFunction;
@@ -213,24 +214,43 @@ public class XSSFPivotTable extends POIX
     }
 
     protected AreaReference getPivotArea() {
-        AreaReference pivotArea = new AreaReference(getPivotCacheDefinition().
-                
getCTPivotCacheDefinition().getCacheSource().getWorksheetSource().getRef());
+        AreaReference pivotArea = new AreaReference(
+                getPivotCacheDefinition()
+                .getCTPivotCacheDefinition()
+                .getCacheSource()
+                .getWorksheetSource()
+                .getRef(),
+                SpreadsheetVersion.EXCEL2007);
         return pivotArea;
     }
+    
+    /**
+     * Verify column index (relative to first column in pivot area) is within 
the
+     * pivot area
+     *
+     * @param columnIndex
+     * @throws IndexOutOfBoundsException
+     */
+    private void checkColumnIndex(int columnIndex) throws 
IndexOutOfBoundsException {
+        AreaReference pivotArea = getPivotArea();
+        int size = pivotArea.getLastCell().getCol() - 
pivotArea.getFirstCell().getCol() + 1;
+
+        if (columnIndex < 0 || columnIndex >= size) {
+            throw new IndexOutOfBoundsException("Column Index: " + columnIndex 
+ ", Size: " + size);
+        }
+    }
 
     /**
      * Add a row label using data from the given column.
-     * @param columnIndex the index of the column to be used as row label.
+     * @param columnIndex the index of the source column to be used as row 
label.
+     * {@code columnIndex} is 0-based indexed and relative to the first column 
in the source.
      */
     @Beta
     public void addRowLabel(int columnIndex) {
+        checkColumnIndex(columnIndex);
+        
         AreaReference pivotArea = getPivotArea();
-        int lastRowIndex = pivotArea.getLastCell().getRow() - 
pivotArea.getFirstCell().getRow();
-        int lastColIndex = pivotArea.getLastCell().getCol() - 
pivotArea.getFirstCell().getCol();
-
-        if(columnIndex > lastColIndex) {
-            throw new IndexOutOfBoundsException();
-        }
+        final int lastRowIndex = pivotArea.getLastCell().getRow() - 
pivotArea.getFirstCell().getRow();
         CTPivotFields pivotFields = pivotTableDefinition.getPivotFields();
 
         CTPivotField pivotField = CTPivotField.Factory.newInstance();
@@ -238,7 +258,7 @@ public class XSSFPivotTable extends POIX
 
         pivotField.setAxis(STAxis.AXIS_ROW);
         pivotField.setShowAll(false);
-        for(int i = 0; i <= lastRowIndex; i++) {
+        for (int i = 0; i <= lastRowIndex; i++) {
             items.addNewItem().setT(STItemType.DEFAULT);
         }
         items.setCount(items.sizeOfItemArray());
@@ -270,7 +290,8 @@ public class XSSFPivotTable extends POIX
     
     /**
      * Add a column label using data from the given column and specified 
function
-     * @param columnIndex the index of the column to be used as column label.
+     * @param columnIndex the index of the source column to be used as column 
label.
+     * {@code columnIndex} is 0-based indexed and relative to the first column 
in the source.
      * @param function the function to be used on the data
      * The following functions exists:
      * Sum, Count, Average, Max, Min, Product, Count numbers, StdDev, StdDevp, 
Var, Varp
@@ -278,12 +299,7 @@ public class XSSFPivotTable extends POIX
      */
     @Beta
     public void addColumnLabel(DataConsolidateFunction function, int 
columnIndex, String valueFieldName) {
-        AreaReference pivotArea = getPivotArea();
-        int lastColIndex = pivotArea.getLastCell().getCol() - 
pivotArea.getFirstCell().getCol();
-
-        if(columnIndex > lastColIndex && columnIndex < 0) {
-            throw new IndexOutOfBoundsException();
-        }
+        checkColumnIndex(columnIndex);
 
         addDataColumn(columnIndex, true);
         addDataField(function, columnIndex, valueFieldName);
@@ -303,7 +319,8 @@ public class XSSFPivotTable extends POIX
 
     /**
      * Add a column label using data from the given column and specified 
function
-     * @param columnIndex the index of the column to be used as column label.
+     * @param columnIndex the index of the source column to be used as column 
label
+     * {@code columnIndex} is 0-based indexed and relative to the first column 
in the source..
      * @param function the function to be used on the data
      * The following functions exists:
      * Sum, Count, Average, Max, Min, Product, Count numbers, StdDev, StdDevp, 
Var, Varp
@@ -323,12 +340,10 @@ public class XSSFPivotTable extends POIX
      */
     @Beta
     private void addDataField(DataConsolidateFunction function, int 
columnIndex, String valueFieldName) {
+        checkColumnIndex(columnIndex);
+        
         AreaReference pivotArea = getPivotArea();
-        int lastColIndex = pivotArea.getLastCell().getCol() - 
pivotArea.getFirstCell().getCol();
-
-        if(columnIndex > lastColIndex && columnIndex < 0) {
-            throw new IndexOutOfBoundsException();
-        }
+        
         CTDataFields dataFields;
         if(pivotTableDefinition.getDataFields() != null) {
             dataFields = pivotTableDefinition.getDataFields();
@@ -352,11 +367,8 @@ public class XSSFPivotTable extends POIX
      */
     @Beta
     public void addDataColumn(int columnIndex, boolean isDataField) {
-        AreaReference pivotArea = getPivotArea();
-        int lastColIndex = pivotArea.getLastCell().getCol() - 
pivotArea.getFirstCell().getCol();
-        if(columnIndex > lastColIndex && columnIndex < 0) {
-            throw new IndexOutOfBoundsException();
-        }
+        checkColumnIndex(columnIndex);
+
         CTPivotFields pivotFields = pivotTableDefinition.getPivotFields();
         CTPivotField pivotField = CTPivotField.Factory.newInstance();
 
@@ -371,13 +383,11 @@ public class XSSFPivotTable extends POIX
      */
     @Beta
     public void addReportFilter(int columnIndex) {
+        checkColumnIndex(columnIndex);
+        
         AreaReference pivotArea = getPivotArea();
-        int lastColIndex = pivotArea.getLastCell().getCol() - 
pivotArea.getFirstCell().getCol();
         int lastRowIndex = pivotArea.getLastCell().getRow() - 
pivotArea.getFirstCell().getRow();
 
-        if(columnIndex > lastColIndex && columnIndex < 0) {
-            throw new IndexOutOfBoundsException();
-        }
         CTPivotFields pivotFields = pivotTableDefinition.getPivotFields();
 
         CTPivotField pivotField = CTPivotField.Factory.newInstance();

Propchange: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
 Mon Sep 19 00:20:44 2016
@@ -591,20 +591,21 @@ public class XSSFSheet extends POIXMLDoc
             }
         } else {
             //search the referenced drawing in the list of the sheet's 
relations
+            final String id = ctDrawing.getId();
             for (RelationPart rp : getRelationParts()){
                 POIXMLDocumentPart p = rp.getDocumentPart();
                 if(p instanceof XSSFVMLDrawing) {
                     XSSFVMLDrawing dr = (XSSFVMLDrawing)p;
                     String drId = rp.getRelationship().getId();
-                    if(drId.equals(ctDrawing.getId())){
+                    if (drId.equals(id)) {
                         drawing = dr;
                         break;
                     }
-                    break;
+                    // do not break here since drawing has not been found yet 
(see bug 52425)
                 }
             }
             if(drawing == null){
-                logger.log(POILogger.ERROR, "Can't find VML drawing with id=" 
+ ctDrawing.getId() + " in the list of the sheet's relationships");
+                logger.log(POILogger.ERROR, "Can't find VML drawing with id=" 
+ id + " in the list of the sheet's relationships");
             }
         }
         return drawing;
@@ -4164,9 +4165,9 @@ public class XSSFSheet extends POIXMLDoc
      * @return The pivot table
      */
     @Beta
-    public XSSFPivotTable createPivotTable(AreaReference source, CellReference 
position, Sheet sourceSheet){
-
-        if(source.getFirstCell().getSheetName() != null && 
!source.getFirstCell().getSheetName().equals(sourceSheet.getSheetName())) {
+    public XSSFPivotTable createPivotTable(AreaReference source, CellReference 
position, Sheet sourceSheet) {
+        final String sourceSheetName = source.getFirstCell().getSheetName();
+        if(sourceSheetName != null && 
!sourceSheetName.equalsIgnoreCase(sourceSheet.getSheetName())) {
             throw new IllegalArgumentException("The area is referenced in 
another sheet than the "
                     + "defined source sheet " + sourceSheet.getSheetName() + 
".");
         }
@@ -4192,8 +4193,10 @@ public class XSSFSheet extends POIXMLDoc
      */
     @Beta
     public XSSFPivotTable createPivotTable(AreaReference source, CellReference 
position){
-        if(source.getFirstCell().getSheetName() != null && 
!source.getFirstCell().getSheetName().equals(this.getSheetName())) {
-            return createPivotTable(source, position, 
getWorkbook().getSheet(source.getFirstCell().getSheetName()));
+        final String sourceSheetName = source.getFirstCell().getSheetName();
+        if(sourceSheetName != null && 
!sourceSheetName.equalsIgnoreCase(this.getSheetName())) {
+            final XSSFSheet sourceSheet = 
getWorkbook().getSheet(sourceSheetName);
+            return createPivotTable(source, position, sourceSheet);
         }
         return createPivotTable(source, position, this);
     }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
 Mon Sep 19 00:20:44 2016
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -33,9 +34,11 @@ import java.util.HashSet;
 import java.util.List;
 
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
+import org.apache.poi.util.NullOutputStream;
 import org.apache.poi.util.PackageHelper;
 import org.apache.poi.util.TempFile;
 import org.junit.Test;
@@ -120,12 +123,43 @@ public final class TestPOIXMLDocument {
         FileOutputStream out = new FileOutputStream(tmp);
         doc.write(out);
         out.close();
+        
+        // Should not be able to write to an output stream that has been closed
+        try {
+            doc.write(out);
+            fail("Should not be able to write to an output stream that has 
been closed.");
+        } catch (final OpenXML4JRuntimeException e) {
+            // FIXME: A better exception class (IOException?) and message 
should be raised
+            // indicating that the document could not be written because the 
output stream is closed.
+            // see {@link 
org.apache.poi.openxml4j.opc.ZipPackage#saveImpl(java.io.OutputStream)}
+            if (e.getMessage().matches("Fail to save: an error occurs while 
saving the package : The part .+ fail to be saved in the stream with marshaller 
.+")) {
+                // expected
+            } else {
+                throw e;
+            }
+        }
+
+        // Should not be able to write a document that has been closed
         doc.close();
+        try {
+            doc.write(new NullOutputStream());
+            fail("Should not be able to write a document that has been 
closed.");
+        } catch (final IOException e) {
+            if (e.getMessage().equals("Cannot write data, document seems to 
have been closed already")) {
+                // expected
+            } else {
+                throw e;
+            }
+        }
+        
+        // Should be able to close a document multiple times, though 
subsequent closes will have no effect.
+        doc.close();
+
 
         @SuppressWarnings("resource")
         OPCPackage pkg2 = OPCPackage.open(tmp.getAbsolutePath());
+        doc = new OPCParser(pkg1);
         try {
-            doc = new OPCParser(pkg1);
             doc.parse(new TestFactory());
             context = new HashMap<String,POIXMLDocumentPart>();
             traverse(doc, context);
@@ -150,6 +184,7 @@ public final class TestPOIXMLDocument {
             }
         } finally {
             doc.close();
+            pkg1.close();
             pkg2.close();
         }
     }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java
 Mon Sep 19 00:20:44 2016
@@ -682,9 +682,12 @@ public class TestExtractorFactory {
         // Text
         try {
             ExtractorFactory.createExtractor(OPCPackage.open(txt.toString()));
-            fail();
+            fail("TestExtractorFactory.testPackage() failed on " + 
txt.toString());
         } catch(UnsupportedFileFormatException e) {
             // Good
+        } catch (Exception e) {
+            System.out.println("TestExtractorFactory.testPackage() failed on " 
+ txt.toString());
+            throw e;
         }
     }
 
@@ -942,6 +945,7 @@ public class TestExtractorFactory {
         
"openxml4j/OPCCompliance_CoreProperties_OnlyOneCorePropertiesPartFAIL.docx",
         
"openxml4j/OPCCompliance_CoreProperties_UnauthorizedXMLLangAttributeFAIL.docx",
         "openxml4j/OPCCompliance_DerivedPartNameFAIL.docx",
+        "openxml4j/invalid.xlsx",
         "spreadsheet/54764-2.xlsx",   // see TestXSSFBugs.bug54764()
         "spreadsheet/54764.xlsx",     // see TestXSSFBugs.bug54764()
         "spreadsheet/Simple.xlsb",

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java
 Mon Sep 19 00:20:44 2016
@@ -943,4 +943,22 @@ public final class TestPackage {
             ZipSecureFile.setMaxTextSize(before);
         }
     }
+    
+    // bug 60128
+    @Test
+    public void testCorruptFile() throws IOException {
+        OPCPackage pkg = null;
+        File file = OpenXML4JTestDataSamples.getSampleFile("invalid.xlsx");
+        try {
+            pkg = OPCPackage.open(file, PackageAccess.READ);
+        } catch (Exception e) {
+            System.out.println(e.getClass().getName());
+            System.out.println(e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (pkg != null) {
+                pkg.close();
+            }
+        }
+    }
 }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestZipPackage.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestZipPackage.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestZipPackage.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestZipPackage.java
 Mon Sep 19 00:20:44 2016
@@ -33,11 +33,14 @@ import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
 
+import org.apache.poi.POIDataSamples;
 import org.apache.poi.POITextExtractor;
 import org.apache.poi.POIXMLException;
 import org.apache.poi.extractor.ExtractorFactory;
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.openxml4j.OpenXML4JTestDataSamples;
+import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
+import org.apache.poi.openxml4j.exceptions.ODFNotOfficeXmlFileException;
 import org.apache.poi.sl.usermodel.SlideShow;
 import org.apache.poi.sl.usermodel.SlideShowFactory;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -181,6 +184,7 @@ public class TestZipPackage {
     public void testClosingStreamOnException() throws IOException {
         InputStream is = 
OpenXML4JTestDataSamples.openSampleStream("dcterms_bug_56479.zip");
         File tmp = File.createTempFile("poi-test-truncated-zip", "");
+        // create a corrupted zip file by truncating a valid zip file to the 
first 100 bytes
         OutputStream os = new FileOutputStream(tmp);
         for (int i = 0; i < 100; i++) {
             os.write(is.read());
@@ -189,11 +193,63 @@ public class TestZipPackage {
         os.close();
         is.close();
 
+        // feed the corrupted zip file to OPCPackage
         try {
             OPCPackage.open(tmp, PackageAccess.READ);
         } catch (Exception e) {
+            // expected: the zip file is invalid
+            // this test does not care if open() throws an exception or not.
         }
+        // If the stream is not closed on exception, it will keep a file 
descriptor to tmp,
+        // and requests to the OS to delete the file will fail.
         assertTrue("Can't delete tmp file", tmp.delete());
-
+    }
+    
+    /**
+     * If ZipPackage is passed an invalid file, a call to close
+     *  (eg from the OPCPackage open method) should tidy up the
+     *  stream / file the broken file is being read from.
+     * See bug #60128 for more
+     */
+    @Test
+    public void testTidyStreamOnInvalidFile() throws Exception {
+        // Spreadsheet has a good mix of alternate file types
+        POIDataSamples files = POIDataSamples.getSpreadSheetInstance();
+        
+        File[] notValidF = new File[] {
+                files.getFile("SampleSS.ods"), files.getFile("SampleSS.txt")
+        };
+        InputStream[] notValidS = new InputStream[] {
+                files.openResourceAsStream("SampleSS.ods"), 
files.openResourceAsStream("SampleSS.txt")
+        };
+
+        for (File notValid : notValidF) {
+            ZipPackage pkg = new ZipPackage(notValid, PackageAccess.READ);
+            assertNotNull(pkg.getZipArchive());
+            assertFalse(pkg.getZipArchive().isClosed());
+            try {
+                pkg.getParts();
+                fail("Shouldn't work");
+            } catch (ODFNotOfficeXmlFileException e) {
+            } catch (NotOfficeXmlFileException ne) {}
+            pkg.close();
+            
+            assertNotNull(pkg.getZipArchive());
+            assertTrue(pkg.getZipArchive().isClosed());
+        }
+        for (InputStream notValid : notValidS) {
+            ZipPackage pkg = new ZipPackage(notValid, PackageAccess.READ);
+            assertNotNull(pkg.getZipArchive());
+            assertFalse(pkg.getZipArchive().isClosed());
+            try {
+                pkg.getParts();
+                fail("Shouldn't work");
+            } catch (ODFNotOfficeXmlFileException e) {
+            } catch (NotOfficeXmlFileException ne) {}
+            pkg.close();
+            
+            assertNotNull(pkg.getZipArchive());
+            assertTrue(pkg.getZipArchive().isClosed());
+        }
     }
 }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSecureTempZip.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSecureTempZip.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSecureTempZip.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSecureTempZip.java
 Mon Sep 19 00:20:44 2016
@@ -149,10 +149,12 @@ public class TestSecureTempZip {
     static class AesZipFileZipEntrySource implements ZipEntrySource {
         final ZipFile zipFile;
         final Cipher ci;
+        boolean closed;
 
         AesZipFileZipEntrySource(ZipFile zipFile, Cipher ci) {
             this.zipFile = zipFile;
             this.ci = ci;
+            this.closed = false;
         }
 
         /**
@@ -172,6 +174,12 @@ public class TestSecureTempZip {
         @Override
         public void close() throws IOException {
             zipFile.close();
+            closed = true;
+        }
+        
+        @Override
+        public boolean isClosed() {
+            return closed;
         }
     }
 }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/ss/formula/TestStructuredReferences.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/ss/formula/TestStructuredReferences.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/ss/formula/TestStructuredReferences.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/ss/formula/TestStructuredReferences.java
 Mon Sep 19 00:20:44 2016
@@ -110,7 +110,7 @@ public class TestStructuredReferences {
     private static void confirm(FormulaEvaluator fe, Cell cell, double 
expectedResult) {
         fe.clearAllCachedResultValues();
         CellValue cv = fe.evaluate(cell);
-        if (cv.getCellType() != CellType.NUMERIC) {
+        if (cv.getCellTypeEnum() != CellType.NUMERIC) {
             fail("expected numeric cell type but got " + cv.formatAsString());
         }
         assertEquals(expectedResult, cv.getNumberValue(), 0.0);
@@ -119,7 +119,7 @@ public class TestStructuredReferences {
     private static void confirm(FormulaEvaluator fe, Cell cell, String 
expectedResult) {
         fe.clearAllCachedResultValues();
         CellValue cv = fe.evaluate(cell);
-        if (cv.getCellType() != CellType.STRING) {
+        if (cv.getCellTypeEnum() != CellType.STRING) {
             fail("expected String cell type but got " + cv.formatAsString());
         }
         assertEquals(expectedResult, cv.getStringValue());

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/ss/formula/functions/TestProper.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/ss/formula/functions/TestProper.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/ss/formula/functions/TestProper.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/ss/formula/functions/TestProper.java
 Mon Sep 19 00:20:44 2016
@@ -96,7 +96,7 @@ public final class TestProper {
         cell11.setCellFormula(formulaText);
         evaluator.clearAllCachedResultValues();
         CellValue cv = evaluator.evaluate(cell11);
-        if (cv.getCellType() != CellType.STRING) {
+        if (cv.getCellTypeEnum() != CellType.STRING) {
             throw new AssertionFailedError("Wrong result type: " + 
cv.formatAsString());
         }
         String actualValue = cv.getStringValue();

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
 Mon Sep 19 00:20:44 2016
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertNot
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -35,6 +36,8 @@ import java.util.Arrays;
 import org.apache.poi.POIDataSamples;
 import org.apache.poi.POITestCase;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackageAccess;
 import org.apache.poi.ss.usermodel.BaseTestXWorkbook;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellType;
@@ -43,6 +46,7 @@ import org.apache.poi.ss.usermodel.Sheet
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.apache.poi.ss.util.CellReference;
+import org.apache.poi.util.NullOutputStream;
 import org.apache.poi.xssf.SXSSFITestDataProvider;
 import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.model.SharedStringsTable;
@@ -535,4 +539,40 @@ public final class TestSXSSFWorkbook ext
         swb.dispose();
         swb.close();
     }
+    
+    /**
+     * To avoid accident changes to the template, you should be able
+     *  to create a SXSSFWorkbook from a read-only XSSF one, then
+     *  change + save that (only). See bug #60010
+     * TODO Fix this to work!
+     */
+    @Test
+    @Ignore
+    public void createFromReadOnlyWorkbook() throws Exception {
+        File input = XSSFTestDataSamples.getSampleFile("sample.xlsx");
+        OPCPackage pkg = OPCPackage.open(input, PackageAccess.READ);
+        XSSFWorkbook xssf = new XSSFWorkbook(pkg);
+        SXSSFWorkbook wb = new SXSSFWorkbook(xssf, 2);
+        
+        String sheetName = "Test SXSSF";
+        Sheet s = wb.createSheet(sheetName);
+        for (int i=0; i<10; i++) {
+            Row r = s.createRow(i);
+            r.createCell(0).setCellValue(true);
+            r.createCell(1).setCellValue(2.4);
+            r.createCell(2).setCellValue("Test Row " + i);
+        }
+        assertEquals(10, s.getLastRowNum());
+        
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        wb.write(bos);
+        wb.dispose();
+        wb.close();
+        
+        xssf = new XSSFWorkbook(new ByteArrayInputStream(bos.toByteArray()));
+        s = xssf.getSheet(sheetName);
+        assertEquals(10, s.getLastRowNum());
+        assertEquals(true, s.getRow(0).getCell(0).getBooleanCellValue());
+        assertEquals("Test Row 9", 
s.getRow(9).getCell(2).getStringCellValue());
+    }
 }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/AllXSSFUsermodelTests.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/AllXSSFUsermodelTests.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/AllXSSFUsermodelTests.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/AllXSSFUsermodelTests.java
 Mon Sep 19 00:20:44 2016
@@ -59,7 +59,7 @@ import org.junit.runners.Suite;
     TestXSSFSheetComments.class,
     TestColumnHelper.class,
     TestHeaderFooterHelper.class,
-    TestXSSFPivotTable.class,
+    //TestXSSFPivotTable.class, //converted to junit4
     TestForkedEvaluator.class
 })
 public final class AllXSSFUsermodelTests {

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java
 Mon Sep 19 00:20:44 2016
@@ -205,14 +205,14 @@ public final class TestFormulaEvaluatorO
                final CellType expectedCellType = expValue.getCellTypeEnum();
                switch (expectedCellType) {
                    case BLANK:
-                       assertEquals(msg, CellType.BLANK, 
actValue.getCellType());
+                       assertEquals(msg, CellType.BLANK, 
actValue.getCellTypeEnum());
                        break;
                    case BOOLEAN:
-                       assertEquals(msg, CellType.BOOLEAN, 
actValue.getCellType());
+                       assertEquals(msg, CellType.BOOLEAN, 
actValue.getCellTypeEnum());
                        assertEquals(msg, expValue.getBooleanCellValue(), 
actValue.getBooleanValue());
                        break;
                    case ERROR:
-                       assertEquals(msg, CellType.ERROR, 
actValue.getCellType());
+                       assertEquals(msg, CellType.ERROR, 
actValue.getCellTypeEnum());
 //                   if(false) { // TODO: fix ~45 functions which are 
currently returning incorrect error values
 //                       assertEquals(msg, expValue.getErrorCellValue(), 
actValue.getErrorValue());
 //                   }
@@ -220,14 +220,14 @@ public final class TestFormulaEvaluatorO
                    case FORMULA: // will never be used, since we will call 
method after formula evaluation
                        fail("Cannot expect formula as result of formula 
evaluation: " + msg);
                    case NUMERIC:
-                       assertEquals(msg, CellType.NUMERIC, 
actValue.getCellType());
+                       assertEquals(msg, CellType.NUMERIC, 
actValue.getCellTypeEnum());
                        TestMathX.assertEquals(msg, 
expValue.getNumericCellValue(), actValue.getNumberValue(), TestMathX.POS_ZERO, 
TestMathX.DIFF_TOLERANCE_FACTOR);
 //                   double delta = 
Math.abs(expValue.getNumericCellValue()-actValue.getNumberValue());
 //                   double pctExpValue = 
Math.abs(0.00001*expValue.getNumericCellValue());
 //                   assertTrue(msg, delta <= pctExpValue);
                        break;
                    case STRING:
-                       assertEquals(msg, CellType.STRING, 
actValue.getCellType());
+                       assertEquals(msg, CellType.STRING, 
actValue.getCellTypeEnum());
                        assertEquals(msg, 
expValue.getRichStringCellValue().getString(), actValue.getStringValue());
                        break;
                    default:

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestMultiSheetFormulaEvaluatorOnXSSF.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestMultiSheetFormulaEvaluatorOnXSSF.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestMultiSheetFormulaEvaluatorOnXSSF.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestMultiSheetFormulaEvaluatorOnXSSF.java
 Mon Sep 19 00:20:44 2016
@@ -188,14 +188,14 @@ public final class TestMultiSheetFormula
         final CellType expectedCellType = expValue.getCellTypeEnum();
         switch (expectedCellType) {
             case BLANK:
-                assertEquals(msg, CellType.BLANK, actValue.getCellType());
+                assertEquals(msg, CellType.BLANK, actValue.getCellTypeEnum());
                 break;
             case BOOLEAN:
-                assertEquals(msg, CellType.BOOLEAN, actValue.getCellType());
+                assertEquals(msg, CellType.BOOLEAN, 
actValue.getCellTypeEnum());
                 assertEquals(msg, expValue.getBooleanCellValue(), 
actValue.getBooleanValue());
                 break;
             case ERROR:
-                assertEquals(msg, CellType.ERROR, actValue.getCellType());
+                assertEquals(msg, CellType.ERROR, actValue.getCellTypeEnum());
 //              if(false) { // TODO: fix ~45 functions which are currently 
returning incorrect error values
 //                  assertEquals(msg, expected.getErrorCellValue(), 
actual.getErrorValue());
 //              }
@@ -203,14 +203,14 @@ public final class TestMultiSheetFormula
             case FORMULA: // will never be used, since we will call method 
after formula evaluation
                 fail("Cannot expect formula as result of formula evaluation: " 
+ msg);
             case NUMERIC:
-                assertEquals(msg, CellType.NUMERIC, actValue.getCellType());
+                assertEquals(msg, CellType.NUMERIC, 
actValue.getCellTypeEnum());
                 TestMathX.assertEquals(msg, expValue.getNumericCellValue(), 
actValue.getNumberValue(), TestMathX.POS_ZERO, TestMathX.DIFF_TOLERANCE_FACTOR);
 //              double delta = 
Math.abs(expected.getNumericCellValue()-actual.getNumberValue());
 //              double pctExpected = 
Math.abs(0.00001*expected.getNumericCellValue());
 //              assertTrue(msg, delta <= pctExpected);
                 break;
             case STRING:
-                assertEquals(msg, CellType.STRING, actValue.getCellType());
+                assertEquals(msg, CellType.STRING, actValue.getCellTypeEnum());
                 assertEquals(msg, 
expValue.getRichStringCellValue().getString(), actValue.getStringValue());
                 break;
             default:

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
 Mon Sep 19 00:20:44 2016
@@ -304,7 +304,7 @@ public final class TestXSSFBugs extends
                         if(c.getCellTypeEnum() == CellType.FORMULA) {
                             CellValue cv = eval.evaluate(c);
 
-                            if(cv.getCellType() == CellType.NUMERIC) {
+                            if(cv.getCellTypeEnum() == CellType.NUMERIC) {
                                 // assert that the calculated value agrees with
                                 // the cached formula result calculated by 
Excel
                                 String formula = c.getCellFormula();
@@ -2187,7 +2187,7 @@ public final class TestXSSFBugs extends
         assertEquals("E4+E5", cell.getCellFormula());
 
         CellValue value = evaluator.evaluate(cell);
-        assertEquals(CellType.ERROR, value.getCellType());
+        assertEquals(CellType.ERROR, value.getCellTypeEnum());
         assertEquals(-60, value.getErrorValue());
         assertEquals("~CIRCULAR~REF~", 
FormulaError.forInt(value.getErrorValue()).getString());
         assertEquals("CIRCULAR_REF", 
FormulaError.forInt(value.getErrorValue()).toString());

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java
 Mon Sep 19 00:20:44 2016
@@ -104,11 +104,11 @@ public class TestXSSFCellStyle {
        @Test
        public void testGetSetBorderBottom() {
         //default values
-        assertEquals(BorderStyle.NONE, cellStyle.getBorderBottom());
+        assertEquals(BorderStyle.NONE, cellStyle.getBorderBottomEnum());
 
         int num = stylesTable.getBorders().size();
         cellStyle.setBorderBottom(BorderStyle.MEDIUM);
-        assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderBottom());
+        assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderBottomEnum());
         //a new border has been added
         assertEquals(num + 1, stylesTable.getBorders().size());
         //id of the created border
@@ -122,7 +122,7 @@ public class TestXSSFCellStyle {
         //setting the same border multiple times should not change borderId
         for (int i = 0; i < 3; i++) {
             cellStyle.setBorderBottom(BorderStyle.MEDIUM);
-            assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderBottom());
+            assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderBottomEnum());
         }
         assertEquals(borderId, cellStyle.getCoreXf().getBorderId());
         assertEquals(num, stylesTable.getBorders().size());
@@ -139,11 +139,11 @@ public class TestXSSFCellStyle {
        @Test
     public void testGetSetBorderRight() {
         //default values
-        assertEquals(BorderStyle.NONE, cellStyle.getBorderRight());
+        assertEquals(BorderStyle.NONE, cellStyle.getBorderRightEnum());
 
         int num = stylesTable.getBorders().size();
         cellStyle.setBorderRight(BorderStyle.MEDIUM);
-        assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderRight());
+        assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderRightEnum());
         //a new border has been added
         assertEquals(num + 1, stylesTable.getBorders().size());
         //id of the created border
@@ -157,7 +157,7 @@ public class TestXSSFCellStyle {
         //setting the same border multiple times should not change borderId
         for (int i = 0; i < 3; i++) {
             cellStyle.setBorderRight(BorderStyle.MEDIUM);
-            assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderRight());
+            assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderRightEnum());
         }
         assertEquals(borderId, cellStyle.getCoreXf().getBorderId());
         assertEquals(num, stylesTable.getBorders().size());
@@ -174,11 +174,11 @@ public class TestXSSFCellStyle {
        @Test
     public void testGetSetBorderLeft() {
         //default values
-        assertEquals(BorderStyle.NONE, cellStyle.getBorderLeft());
+        assertEquals(BorderStyle.NONE, cellStyle.getBorderLeftEnum());
 
         int num = stylesTable.getBorders().size();
         cellStyle.setBorderLeft(BorderStyle.MEDIUM);
-        assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderLeft());
+        assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderLeftEnum());
         //a new border has been added
         assertEquals(num + 1, stylesTable.getBorders().size());
         //id of the created border
@@ -192,7 +192,7 @@ public class TestXSSFCellStyle {
         //setting the same border multiple times should not change borderId
         for (int i = 0; i < 3; i++) {
             cellStyle.setBorderLeft(BorderStyle.MEDIUM);
-            assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderLeft());
+            assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderLeftEnum());
         }
         assertEquals(borderId, cellStyle.getCoreXf().getBorderId());
         assertEquals(num, stylesTable.getBorders().size());
@@ -209,11 +209,11 @@ public class TestXSSFCellStyle {
        @Test
     public void testGetSetBorderTop() {
         //default values
-        assertEquals(BorderStyle.NONE, cellStyle.getBorderTop());
+        assertEquals(BorderStyle.NONE, cellStyle.getBorderTopEnum());
 
         int num = stylesTable.getBorders().size();
         cellStyle.setBorderTop(BorderStyle.MEDIUM);
-        assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderTop());
+        assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderTopEnum());
         //a new border has been added
         assertEquals(num + 1, stylesTable.getBorders().size());
         //id of the created border
@@ -227,7 +227,7 @@ public class TestXSSFCellStyle {
         //setting the same border multiple times should not change borderId
         for (int i = 0; i < 3; i++) {
             cellStyle.setBorderTop(BorderStyle.MEDIUM);
-            assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderTop());
+            assertEquals(BorderStyle.MEDIUM, cellStyle.getBorderTopEnum());
         }
         assertEquals(borderId, cellStyle.getCoreXf().getBorderId());
         assertEquals(num, stylesTable.getBorders().size());
@@ -243,7 +243,7 @@ public class TestXSSFCellStyle {
     
     private void testGetSetBorderXMLBean(BorderStyle border, 
STBorderStyle.Enum expected) {
         cellStyle.setBorderTop(border);
-        assertEquals(border, cellStyle.getBorderTop());
+        assertEquals(border, cellStyle.getBorderTopEnum());
         int borderId = (int)cellStyle.getCoreXf().getBorderId();
         assertTrue(borderId > 0);
         //check changes in the underlying xml bean
@@ -256,7 +256,7 @@ public class TestXSSFCellStyle {
     @Test
     public void testGetSetBorderNone() {
         cellStyle.setBorderTop(BorderStyle.NONE);
-        assertEquals(BorderStyle.NONE, cellStyle.getBorderTop());
+        assertEquals(BorderStyle.NONE, cellStyle.getBorderTopEnum());
         int borderId = (int)cellStyle.getCoreXf().getBorderId();
         assertTrue(borderId > 0);
         //check changes in the underlying xml bean
@@ -562,10 +562,10 @@ public class TestXSSFCellStyle {
         assertEquals(style2.getRightBorderColor(), 
style1.getRightBorderColor());
         assertEquals(style2.getBottomBorderColor(), 
style1.getBottomBorderColor());
 
-        assertEquals(style2.getBorderBottom(), style1.getBorderBottom());
-        assertEquals(style2.getBorderLeft(), style1.getBorderLeft());
-        assertEquals(style2.getBorderRight(), style1.getBorderRight());
-        assertEquals(style2.getBorderTop(), style1.getBorderTop());
+        assertEquals(style2.getBorderBottomEnum(), 
style1.getBorderBottomEnum());
+        assertEquals(style2.getBorderLeftEnum(), style1.getBorderLeftEnum());
+        assertEquals(style2.getBorderRightEnum(), style1.getBorderRightEnum());
+        assertEquals(style2.getBorderTopEnum(), style1.getBorderTopEnum());
         wb2.close();
        }
 
@@ -999,7 +999,7 @@ public class TestXSSFCellStyle {
         Workbook copy = XSSFTestDataSamples.writeOutAndReadBack(target);
 
         // previously this failed because the border-element was not copied 
over 
-        copy.getCellStyleAt((short)1).getBorderBottom();
+        copy.getCellStyleAt((short)1).getBorderBottomEnum();
         
         copy.close();
         

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
 Mon Sep 19 00:20:44 2016
@@ -682,4 +682,15 @@ public final class TestXSSFFormulaEvalua
         value = evaluator.evaluate(cell);
         assertEquals(1, value.getNumberValue(), 0.001);
     }
+    
+    @Test
+    public void evaluateInCellReturnsSameDataType() throws IOException {
+        XSSFWorkbook wb = new XSSFWorkbook();
+        wb.createSheet().createRow(0).createCell(0);
+        XSSFFormulaEvaluator evaluator = 
wb.getCreationHelper().createFormulaEvaluator();
+        XSSFCell cell = wb.getSheetAt(0).getRow(0).getCell(0);
+        XSSFCell same = evaluator.evaluateInCell(cell);
+        assertSame(cell, same);
+        wb.close();
+    }
 }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java
 Mon Sep 19 00:20:44 2016
@@ -16,30 +16,39 @@
 ==================================================================== */
 package org.apache.poi.xssf.usermodel;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.DataConsolidateFunction;
 import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.util.CellReference;
+import org.apache.poi.xssf.XSSFITestDataProvider;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageField;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageFields;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields;
 import 
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition;
 import 
org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction;
 
-import junit.framework.TestCase;
-
-public class TestXSSFPivotTable extends TestCase {
+public class TestXSSFPivotTable {
+    private static final XSSFITestDataProvider _testDataProvider = 
XSSFITestDataProvider.instance;
+    private XSSFWorkbook wb;
     private XSSFPivotTable pivotTable;
     private XSSFPivotTable offsetPivotTable;
     private Cell offsetOuterCell;
     
-    @Override
+    @Before
     public void setUp(){
-        Workbook wb = new XSSFWorkbook();
-        XSSFSheet sheet = (XSSFSheet) wb.createSheet();
+        wb = new XSSFWorkbook();
+        XSSFSheet sheet =  wb.createSheet();
 
         Row row1 = sheet.createRow(0);
         // Create a cell and put a value in it.
@@ -72,10 +81,10 @@ public class TestXSSFPivotTable extends
         Cell cell12 = row1.createCell(3);
         cell12.setCellValue(12.12);
 
-        AreaReference source = new AreaReference("A1:C2");
+        AreaReference source = new AreaReference("A1:C2", 
_testDataProvider.getSpreadsheetVersion());
         pivotTable = sheet.createPivotTable(source, new CellReference("H5"));
         
-        XSSFSheet offsetSheet = (XSSFSheet) wb.createSheet();
+        XSSFSheet offsetSheet = wb.createSheet();
         
         Row tableRow_1 = offsetSheet.createRow(1);
         offsetOuterCell = tableRow_1.createCell(1);
@@ -114,11 +123,19 @@ public class TestXSSFPivotTable extends
         AreaReference offsetSource = new AreaReference(new 
CellReference("C2"), new CellReference("E4"));
         offsetPivotTable = offsetSheet.createPivotTable(offsetSource, new 
CellReference("C6"));
     }
+    
+    @After
+    public void tearDown() throws IOException {
+        XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
+        wb.close();
+        wb2.close();
+    }
 
     /**
      * Verify that when creating a row label it's  created on the correct row
      * and the count is increased by one.
      */
+    @Test
     public void testAddRowLabelToPivotTable() {
         int columnIndex = 0;
 
@@ -141,6 +158,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that it's not possible to create a row label outside of the 
referenced area.
      */
+    @Test
     public void testAddRowLabelOutOfRangeThrowsException() {
         int columnIndex = 5;
 
@@ -155,6 +173,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that when creating one column label, no col fields are being 
created.
      */
+    @Test
     public void testAddOneColumnLabelToPivotTableDoesNotCreateColField() {
         int columnIndex = 0;
 
@@ -167,6 +186,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that it's possible to create three column labels with different 
DataConsolidateFunction
      */
+    @Test
     public void testAddThreeDifferentColumnLabelsToPivotTable() {
         int columnOne = 0;
         int columnTwo = 1;
@@ -184,6 +204,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that it's possible to create three column labels with the same 
DataConsolidateFunction
      */
+    @Test
     public void testAddThreeSametColumnLabelsToPivotTable() {
         int columnOne = 0;
         int columnTwo = 1;
@@ -200,6 +221,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that when creating two column labels, a col field is being 
created and X is set to -2.
      */
+    @Test
     public void testAddTwoColumnLabelsToPivotTable() {
         int columnOne = 0;
         int columnTwo = 1;
@@ -214,6 +236,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that a data field is created when creating a data column
      */
+    @Test
     public void testColumnLabelCreatesDataField() {
         int columnIndex = 0;
 
@@ -229,6 +252,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that it's possible to set a custom name when creating a data 
column
      */
+    @Test
     public void testColumnLabelSetCustomName() {
         int columnIndex = 0;
 
@@ -245,6 +269,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that it's not possible to create a column label outside of the 
referenced area.
      */
+    @Test
     public void testAddColumnLabelOutOfRangeThrowsException() {
         int columnIndex = 5;
 
@@ -260,6 +285,7 @@ public class TestXSSFPivotTable extends
      * Verify when creating a data column set to a data field, the data field 
with the corresponding
      * column index will be set to true.
      */
+    @Test
     public void testAddDataColumn() {
         int columnIndex = 0;
         boolean isDataField = true;
@@ -272,6 +298,7 @@ public class TestXSSFPivotTable extends
     /**
      * Verify that it's not possible to create a data column outside of the 
referenced area.
      */
+    @Test
     public void testAddDataColumnOutOfRangeThrowsException() {
         int columnIndex = 5;
         boolean isDataField = true;
@@ -301,6 +328,7 @@ public class TestXSSFPivotTable extends
      /**
      * Verify that it's not possible to create a new filter outside of the 
referenced area.
      */
+    @Test
     public void testAddReportFilterOutOfRangeThrowsException() {
         int columnIndex = 5;
         try {
@@ -315,10 +343,28 @@ public class TestXSSFPivotTable extends
      * Verify that the Pivot Table operates only within the referenced area, 
even when the
      * first column of the referenced area is not index 0.
      */
+    @Test
     public void testAddDataColumnWithOffsetData() {
         offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1);
         assertEquals(CellType.NUMERIC, offsetOuterCell.getCellTypeEnum());
         
         offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 0);
     }
+    
+    @Test
+    public void testPivotTableSheetNamesAreCaseInsensitive() {
+        wb.setSheetName(0,  "original");
+        wb.setSheetName(1,  "offset");
+        XSSFSheet original = wb.getSheet("OriginaL");
+        XSSFSheet offset = wb.getSheet("OffseT");
+        // assume sheets are accessible via case-insensitive name
+        assertNotNull(original);
+        assertNotNull(offset);
+        
+        AreaReference source = new AreaReference("ORIGinal!A1:C2", 
_testDataProvider.getSpreadsheetVersion());
+        // create a pivot table on the same sheet, case insensitive
+        original.createPivotTable(source, new CellReference("W1"));
+        // create a pivot table on a different sheet, case insensitive
+        offset.createPivotTable(source, new CellReference("W1"));
+    }
 }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
 Mon Sep 19 00:20:44 2016
@@ -47,6 +47,9 @@ import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellCopyPolicy;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Comment;
+import org.apache.poi.ss.usermodel.CreationHelper;
+import org.apache.poi.ss.usermodel.Drawing;
 import org.apache.poi.ss.usermodel.FormulaError;
 import org.apache.poi.ss.usermodel.IgnoredErrorType;
 import org.apache.poi.ss.usermodel.IndexedColors;
@@ -1975,4 +1978,46 @@ public final class TestXSSFSheet extends
             wb.close();
         }
     }
+    
+    /**
+     * See bug #52425
+     */
+    @Test
+    public void testInsertCommentsToClonedSheet() {
+       Workbook wb = XSSFTestDataSamples.openSampleWorkbook("52425.xlsx");
+               CreationHelper helper = wb.getCreationHelper();
+               Sheet sheet2 = wb.createSheet("Sheet 2");
+               Sheet sheet3 = wb.cloneSheet(0);
+               wb.setSheetName(2, "Sheet 3");
+
+               // Adding Comment to new created Sheet 2
+               addComments(helper, sheet2);
+               // Adding Comment to cloned Sheet 3
+               addComments(helper, sheet3);
+       }
+    
+    private void addComments(CreationHelper helper, Sheet sheet) {
+               Drawing drawing = sheet.createDrawingPatriarch();
+
+               for (int i = 0; i < 2; i++) {
+                       ClientAnchor anchor = helper.createClientAnchor();
+                       anchor.setCol1(0);
+                       anchor.setRow1(0 + i);
+                       anchor.setCol2(2);
+                       anchor.setRow2(3 + i);
+
+                       Comment comment = drawing.createCellComment(anchor);
+                       
comment.setString(helper.createRichTextString("BugTesting"));
+
+                       Row row = sheet.getRow(0 + i);
+                       if (row == null)
+                               row = sheet.createRow(0 + i);
+                       Cell cell = row.getCell(0);
+                       if (cell == null)
+                               cell = row.createCell(0);
+
+                       cell.setCellComment(comment);
+               }
+
+    }
 }

Modified: 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java
 Mon Sep 19 00:20:44 2016
@@ -51,6 +51,7 @@ public final class TestXSSFSheetShiftRow
         // TODO - support shifting of page breaks
     }
 
+    /** Error occurred at FormulaShifter#rowMoveAreaPtg while shift rows 
upward. */
     @Test
     public void testBug54524() throws IOException {
         XSSFWorkbook workbook = 
XSSFTestDataSamples.openSampleWorkbook("54524.xlsx");
@@ -66,6 +67,7 @@ public final class TestXSSFSheetShiftRow
         workbook.close();
     }
 
+    /**  negative row shift causes corrupted data or throws exception */
     @Test
     public void testBug53798() throws IOException {
         // NOTE that for HSSF (.xls) negative shifts combined with positive 
ones do work as expected  
@@ -124,6 +126,7 @@ public final class TestXSSFSheetShiftRow
         }
     }
     
+    /** negative row shift causes corrupted data or throws exception */
     @Test
     public void testBug53798a() throws IOException {
         Workbook wb = XSSFTestDataSamples.openSampleWorkbook("53798.xlsx");
@@ -152,6 +155,7 @@ public final class TestXSSFSheetShiftRow
         read.close();
     }
     
+    /** Shifting rows with comment result - Unreadable content error and 
comment deletion */
     @Test
     public void testBug56017() throws IOException {
         Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56017.xlsx");
@@ -193,6 +197,7 @@ public final class TestXSSFSheetShiftRow
         wbBack.close();
     }
 
+    /** Moving the active sheet and deleting the others results in a corrupted 
file */
     @Test
     public void test57171() throws IOException {
         Workbook wb = 
XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
@@ -210,6 +215,7 @@ public final class TestXSSFSheetShiftRow
         wbRead.close();
     }
 
+    /**  Cannot delete an arbitrary sheet in an XLS workbook (only the last 
one) */
     @Test
     public void test57163() throws IOException {
         Workbook wb = 
XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
@@ -314,6 +320,7 @@ public final class TestXSSFSheetShiftRow
         wb.close();
     }
 
+    /** Failed to clone a sheet from an Excel 2010 */
     @Test
     public void test57165() throws IOException {
         Workbook wb = 
XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
@@ -341,6 +348,7 @@ public final class TestXSSFSheetShiftRow
         }
     }
 
+    /** Shifting rows with cell comments only shifts comments from first such 
cell. Other cell comments not shifted */
     @Test
     public void testBug57828_OnlyOneCommentShiftedInRow() throws IOException {
         XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57828.xlsx");

Modified: 
poi/branches/hssf_cryptoapi/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
URL: 
http://svn.apache.org/viewvc/poi/branches/hssf_cryptoapi/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java?rev=1761376&r1=1761375&r2=1761376&view=diff
==============================================================================
--- 
poi/branches/hssf_cryptoapi/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
 (original)
+++ 
poi/branches/hssf_cryptoapi/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
 Mon Sep 19 00:20:44 2016
@@ -804,6 +804,7 @@ public final class HSLFSlideShow impleme
         * @param format        The format of the picture.
         *
         * @return the picture data.
+        * @since 3.15 beta 2
         */
        @Override
        public HSLFPictureData addPicture(InputStream is, PictureType format) 
throws IOException {
@@ -822,6 +823,7 @@ public final class HSLFSlideShow impleme
         *            The format of the picture.
         *
         * @return the picture data.
+        * @since 3.15 beta 2
         */
        @Override
        public HSLFPictureData addPicture(File pict, PictureType format) throws 
IOException {
@@ -844,6 +846,7 @@ public final class HSLFSlideShow impleme
      * 
      * @param pictureData The picture data to find in the SlideShow
      * @return {@code null} if picture data is not found in this slideshow
+     * @since 3.15 beta 3
      */
     @Override
     public HSLFPictureData findPictureData(byte[] pictureData) {



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org
For additional commands, e-mail: commits-h...@poi.apache.org

Reply via email to