sonar fixes - blocker

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1839745 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java b/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java
index 0cc52e4..68bd85b 100644
--- a/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java
+++ b/src/java/org/apache/poi/poifs/filesystem/EntryUtils.java
@@ -159,6 +159,11 @@
         }
 
         @Override
+        public int hashCode() {
+            return dir.getName().hashCode();
+        }
+
+        @Override
         public boolean equals(Object other) {
             if (!(other instanceof DirectoryDelegate)) {
                 return false;
@@ -192,6 +197,11 @@
         }
 
         @Override
+        public int hashCode() {
+            return doc.getName().hashCode();
+        }
+
+        @Override
         public boolean equals(Object other) {
             if (!(other instanceof DocumentDelegate)) {
                 return false;
diff --git a/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java b/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java
index 88094f2..f9549cf 100644
--- a/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java
+++ b/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java
@@ -127,9 +127,10 @@
    @Override
    public void copyTo(OutputStream stream) throws IOException {
       // Wrap the OutputSteam as a channel
-      WritableByteChannel out = Channels.newChannel(stream);
-      // Now do the transfer
-      channel.transferTo(0, channel.size(), out);
+      try (WritableByteChannel out = Channels.newChannel(stream)) {
+          // Now do the transfer
+          channel.transferTo(0, channel.size(), out);
+      }
    }
 
    @Override
diff --git a/src/java/org/apache/poi/ss/usermodel/TableStyleType.java b/src/java/org/apache/poi/ss/usermodel/TableStyleType.java
index be7c84c..870436a 100644
--- a/src/java/org/apache/poi/ss/usermodel/TableStyleType.java
+++ b/src/java/org/apache/poi/ss/usermodel/TableStyleType.java
@@ -65,7 +65,7 @@
             // could do fancy math, but tables can't be that wide, a simple loop is fine
             // if not in this type of stripe, return null
             while (firstStart <= c) {
-                if (c >= firstStart && c <= secondStart -1) {
+                if (c <= secondStart -1) {
                     return new CellRangeAddress(table.getStartRowIndex(), table.getEndRowIndex(), firstStart, secondStart - 1);
                 }
                 firstStart = secondStart + c2Stripe;
@@ -121,7 +121,7 @@
             // could do fancy math, but tables can't be that wide, a simple loop is fine
             // if not in this type of stripe, return null
             while (firstStart <= c) {
-                if (c >= firstStart && c <= secondStart -1) {
+                if (c <= secondStart -1) {
                     return new CellRangeAddress(firstStart, secondStart - 1, table.getStartColIndex(), table.getEndColIndex());
                 }
                 firstStart = secondStart + c2Stripe;
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
index 975e21d..ecec63c 100644
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
+++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
@@ -101,7 +101,7 @@
      */
     ZipPackage(InputStream in, PackageAccess access) throws IOException {
         super(access);
-        ZipArchiveThresholdInputStream zis = ZipHelper.openZipStream(in);
+        ZipArchiveThresholdInputStream zis = ZipHelper.openZipStream(in); // NOSONAR
         try {
             this.zipArchive = new ZipInputStreamZipEntrySource(zis);
         } catch (final IOException e) {
diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFTextParagraph.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFTextParagraph.java
index 7ba6f8e..46815ea 100644
--- a/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFTextParagraph.java
+++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFTextParagraph.java
@@ -24,6 +24,8 @@
 import java.util.Optional;
 import java.util.function.Function;
 
+import org.apache.commons.collections4.iterators.IteratorIterable;
+import org.apache.commons.collections4.iterators.ReverseListIterator;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LocaleUtil;
@@ -97,8 +99,8 @@
     public XDDFTextRun appendLineBreak() {
         CTTextLineBreak br = _p.addNewBr();
         // by default, line break has the font properties of the last text run
-        for (int i = _runs.size() - 1; i <= 0; i--) {
-            CTTextCharacterProperties prevProps = _runs.get(i).getProperties();
+        for (XDDFTextRun tr : new IteratorIterable<>(new ReverseListIterator<>(_runs))) {
+            CTTextCharacterProperties prevProps = tr.getProperties();
             // let's find one that is not undefined
             if (prevProps != null) {
                 br.setRPr((CTTextCharacterProperties) prevProps.copy());
diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
index c066fcd..6fbcb14 100644
--- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
+++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
@@ -931,8 +931,10 @@
             }
 
             //Substitute the template entries with the generated sheet data files
-            final ZipEntrySource source = new ZipFileZipEntrySource(new ZipSecureFile(tmplFile));
-            injectData(source, stream);
+            try (ZipSecureFile zf = new ZipSecureFile(tmplFile);
+                 ZipFileZipEntrySource source = new ZipFileZipEntrySource(zf)) {
+                injectData(source, stream);
+            }
         } finally {
             deleted = tmplFile.delete();
         }
diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
index 840e533..c971b3a 100644
--- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
+++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
@@ -292,7 +292,7 @@
         String color = null;
         if (run.isSetRPr()) {
             CTRPr pr = getRunProperties(false);
-            if (pr.isSetColor()) {
+            if (pr != null && pr.isSetColor()) {
                 CTColor clr = pr.getColor();
                 color = clr.xgetVal().getStringValue();
             }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
index 0e6e767..ecc360e 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
@@ -46,8 +46,8 @@
 import org.apache.poi.hslf.record.*;
 import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.poifs.filesystem.Ole10Native;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.sl.usermodel.MasterSheet;
 import org.apache.poi.sl.usermodel.PictureData.PictureType;
 import org.apache.poi.sl.usermodel.Resources;
@@ -595,6 +595,9 @@
 		// The order of slides is defined by the order of slide atom sets in the
 		// SlideListWithText container.
 		SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
+		if (slwt == null) {
+			throw new IllegalStateException("Slide record not defined.");
+		}
 		SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
 
 		SlideAtomsSet tmp = sas[oldSlideNumber - 1];
@@ -635,6 +638,9 @@
 		}
 
 		SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
+		if (slwt == null) {
+			throw new IllegalStateException("Slide record not defined.");
+		}
 		SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
 
 		List<Record> records = new ArrayList<>();
@@ -678,12 +684,14 @@
 						records.addAll(Arrays.asList(ns.getSlideRecords()));
 					}
 				}
+
+				if (!na.isEmpty()) {
+					nslwt.setSlideAtomsSets(na.toArray(new SlideAtomsSet[0]));
+					nslwt.setChildRecord(records.toArray(new Record[0]));
+				}
 			}
 			if (na.isEmpty()) {
 				_documentRecord.removeSlideListWithText(nslwt);
-			} else {
-				nslwt.setSlideAtomsSets(na.toArray(new SlideAtomsSet[0]));
-				nslwt.setChildRecord(records.toArray(new Record[0]));
 			}
 		}
 
@@ -1113,7 +1121,7 @@
     }
 
     @Override
-    public MasterSheet<HSLFShape,HSLFTextParagraph> createMasterSheet() throws IOException {
+    public MasterSheet<HSLFShape,HSLFTextParagraph> createMasterSheet() {
 		// TODO implement or throw exception if not supported
         return null;
     }
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/converter/WordToTextConverter.java b/src/scratchpad/src/org/apache/poi/hwpf/converter/WordToTextConverter.java
index 0cdc68d..b469df3 100644
--- a/src/scratchpad/src/org/apache/poi/hwpf/converter/WordToTextConverter.java
+++ b/src/scratchpad/src/org/apache/poi/hwpf/converter/WordToTextConverter.java
@@ -17,6 +17,7 @@
 package org.apache.poi.hwpf.converter;
 
 import java.io.File;
+import java.io.IOException;
 import java.io.StringWriter;
 import java.lang.reflect.Method;
 import java.util.List;
@@ -114,14 +115,13 @@
         serializer.transform( domSource, streamResult );
     }
 
-    static Document process( File docFile ) throws Exception
-    {
-        final HWPFDocumentCore wordDocument = AbstractWordUtils
-                .loadDoc( docFile );
-        WordToTextConverter wordToTextConverter = new WordToTextConverter(
-                XMLHelper.getDocumentBuilderFactory().newDocumentBuilder().newDocument() );
-        wordToTextConverter.processDocument( wordDocument );
-        return wordToTextConverter.getDocument();
+    private static Document process( File docFile ) throws IOException, ParserConfigurationException {
+        try (final HWPFDocumentCore wordDocument = AbstractWordUtils.loadDoc( docFile )) {
+            WordToTextConverter wordToTextConverter = new WordToTextConverter(
+                    XMLHelper.getDocumentBuilderFactory().newDocumentBuilder().newDocument());
+            wordToTextConverter.processDocument(wordDocument);
+            return wordToTextConverter.getDocument();
+        }
     }
 
     private AtomicInteger noteCounters = new AtomicInteger( 1 );
@@ -153,12 +153,14 @@
      * @param document
      *            XML DOM Document used as storage for text pieces
      */
-    public WordToTextConverter( Document document )
+    @SuppressWarnings("WeakerAccess")
+    public WordToTextConverter(Document document )
     {
         this.textDocumentFacade = new TextDocumentFacade( document );
     }
 
-    public WordToTextConverter( TextDocumentFacade textDocumentFacade )
+    @SuppressWarnings("unused")
+    public WordToTextConverter(TextDocumentFacade textDocumentFacade )
     {
         this.textDocumentFacade = textDocumentFacade;
     }
@@ -192,6 +194,7 @@
         return stringWriter.toString();
     }
 
+    @SuppressWarnings("WeakerAccess")
     public boolean isOutputSummaryInformation()
     {
         return outputSummaryInformation;
@@ -275,7 +278,7 @@
 
         currentBlock.appendChild( textDocumentFacade.createText( " ("
                 + UNICODECHAR_ZERO_WIDTH_SPACE
-                + hyperlink.replaceAll( "\\/", UNICODECHAR_ZERO_WIDTH_SPACE
+                + hyperlink.replaceAll( "/", UNICODECHAR_ZERO_WIDTH_SPACE
                         + "\\/" + UNICODECHAR_ZERO_WIDTH_SPACE )
                 + UNICODECHAR_ZERO_WIDTH_SPACE + ")" ) );
     }
@@ -307,9 +310,7 @@
         block.appendChild( textDocumentFacade.createText( "\n" ) );
     }
 
-    protected void processNote( HWPFDocument wordDocument, Element block,
-            Range noteTextRange )
-    {
+    private void processNote( HWPFDocument wordDocument, Element block, Range noteTextRange ) {
         final int noteIndex = noteCounters.getAndIncrement();
         block.appendChild( textDocumentFacade
                 .createText( UNICODECHAR_ZERO_WIDTH_SPACE + "[" + noteIndex
@@ -457,7 +458,8 @@
         }
     }
 
-    public void setOutputSummaryInformation( boolean outputDocumentInformation )
+    @SuppressWarnings("unused")
+    public void setOutputSummaryInformation(boolean outputDocumentInformation )
     {
         this.outputSummaryInformation = outputDocumentInformation;
     }
diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/OldTextPiece.java b/src/scratchpad/src/org/apache/poi/hwpf/model/OldTextPiece.java
index 6fc78df..df0104f 100644
--- a/src/scratchpad/src/org/apache/poi/hwpf/model/OldTextPiece.java
+++ b/src/scratchpad/src/org/apache/poi/hwpf/model/OldTextPiece.java
@@ -18,6 +18,8 @@
 package org.apache.poi.hwpf.model;
 
 
+import java.util.Arrays;
+
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.NotImplemented;
 
@@ -102,6 +104,12 @@
         return 42; // any arbitrary constant will do
     }
 
+    @Override
+    public boolean equals(Object other) {
+        return other instanceof OldTextPiece &&
+            Arrays.equals(rawBytes, ((OldTextPiece)other).rawBytes);
+    }
+
     public String toString() {
         return "OldTextPiece from " + getStart() + " to " + getEnd() + " ("
                 + getPieceDescriptor() + ")";