git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1896305 13f79535-47bb-0310-9956-ffa450edef68tags/REL_5_2_0
@@ -373,6 +373,16 @@ public final class PackageRelationshipCollection implements Iterable<PackageRela | |||
return relationshipsByID.values().iterator(); | |||
} | |||
/** | |||
* Get this collection's spliterator. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<PackageRelationship> spliterator() { | |||
return relationshipsByID.values().spliterator(); | |||
} | |||
/** | |||
* Get an iterator of a collection with all relationship with the specified | |||
* type. |
@@ -22,6 +22,7 @@ import java.util.Collections; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Optional; | |||
import java.util.Spliterator; | |||
import java.util.function.Function; | |||
import java.util.function.Predicate; | |||
@@ -48,7 +49,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing; | |||
* is the highest level text separation mechanism. | |||
*/ | |||
@Beta | |||
public class XDDFTextParagraph { | |||
public class XDDFTextParagraph implements Iterable<XDDFTextRun> { | |||
private XDDFTextBody _parent; | |||
private XDDFParagraphProperties _properties; | |||
private final CTTextParagraph _p; | |||
@@ -115,10 +116,19 @@ public class XDDFTextParagraph { | |||
return _runs; | |||
} | |||
@Override | |||
public Iterator<XDDFTextRun> iterator() { | |||
return _runs.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<XDDFTextRun> spliterator() { | |||
return _runs.spliterator(); | |||
} | |||
/** | |||
* Append a line break. | |||
* |
@@ -25,6 +25,7 @@ import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Optional; | |||
import java.util.Spliterator; | |||
import java.util.function.Function; | |||
import java.util.function.Predicate; | |||
@@ -87,6 +88,14 @@ public abstract class XSLFTextShape extends XSLFSimpleShape | |||
return getTextParagraphs().iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<XSLFTextParagraph> spliterator() { | |||
return getTextParagraphs().spliterator(); | |||
} | |||
@Override | |||
public String getText() { | |||
StringBuilder out = new StringBuilder(); |
@@ -18,6 +18,7 @@ | |||
package org.apache.poi.xssf.streaming; | |||
import java.util.Iterator; | |||
import java.util.Spliterator; | |||
import org.apache.poi.ss.usermodel.ClientAnchor; | |||
import org.apache.poi.ss.usermodel.Comment; | |||
@@ -66,6 +67,14 @@ public class SXSSFDrawing implements Drawing<XSSFShape> { | |||
public Iterator<XSSFShape> iterator() { | |||
return _drawing.getShapes().iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<XSSFShape> spliterator() { | |||
return _drawing.getShapes().spliterator(); | |||
} | |||
} | |||
@@ -21,6 +21,8 @@ import java.util.Iterator; | |||
import java.util.Map.Entry; | |||
import java.util.NoSuchElementException; | |||
import java.util.SortedMap; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
import java.util.TreeMap; | |||
import org.apache.poi.ss.SpreadsheetVersion; | |||
@@ -61,6 +63,11 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow> | |||
return new CellIterator(); | |||
} | |||
public Spliterator<Cell> allCellsSpliterator() | |||
{ | |||
return Spliterators.spliterator(allCellsIterator(), getLastCellNum(), 0); | |||
} | |||
public boolean hasCustomHeight() | |||
{ | |||
return _height!=-1; | |||
@@ -100,15 +107,6 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow> | |||
this._collapsed = collapsed; | |||
} | |||
//begin of interface implementation | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
@Override | |||
public Iterator<Cell> iterator() | |||
{ | |||
return new FilledCellIterator(); | |||
} | |||
/** | |||
* Use this to create new cells within the row and return it. | |||
* <p> | |||
@@ -427,7 +425,23 @@ public class SXSSFRow implements Row, Comparable<SXSSFRow> | |||
@Override | |||
public Iterator<Cell> cellIterator() | |||
{ | |||
return iterator(); | |||
return new FilledCellIterator(); | |||
} | |||
/** | |||
* Create a spliterator over the cells from [0, getLastCellNum()). | |||
* Includes blank cells, excludes empty cells | |||
* | |||
* Returns a spliterator over all filled cells (created via Row.createCell()) | |||
* Throws ConcurrentModificationException if cells are added, moved, or | |||
* removed after the spliterator is created. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
@SuppressWarnings("unchecked") | |||
public Spliterator<Cell> spliterator() { | |||
return (Spliterator<Cell>)(Spliterator<? extends Cell>) _cells.values().spliterator(); | |||
} | |||
/** |
@@ -24,6 +24,7 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
import java.util.TreeMap; | |||
import org.apache.poi.ss.SpreadsheetVersion; | |||
@@ -100,11 +101,6 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions { | |||
} | |||
//start of interface implementation | |||
@Override | |||
public Iterator<Row> iterator() { | |||
return rowIterator(); | |||
} | |||
/** | |||
* Create a new row within the sheet and return the high level representation | |||
* | |||
@@ -508,6 +504,20 @@ public class SXSSFSheet implements Sheet, OoxmlSheetExtensions { | |||
return result; | |||
} | |||
/** | |||
* Returns a spliterator of the physical rows | |||
* | |||
* @return a spliterator of the PHYSICAL rows. Meaning the 3rd element may not | |||
* be the third row if say for instance the second row is undefined. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
@SuppressWarnings("unchecked") | |||
public Spliterator<Row> spliterator() { | |||
return (Spliterator<Row>)(Spliterator<? extends Row>) _rows.values().spliterator(); | |||
} | |||
/** | |||
* Flag indicating whether the sheet displays Automatic Page Breaks. | |||
* |
@@ -31,6 +31,7 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.NoSuchElementException; | |||
import java.util.Spliterator; | |||
import org.apache.commons.compress.archivers.ArchiveOutputStream; | |||
import org.apache.commons.compress.archivers.zip.Zip64Mode; | |||
@@ -758,6 +759,19 @@ public class SXSSFWorkbook implements Workbook { | |||
return new SheetIterator<>(); | |||
} | |||
/** | |||
* Returns a spliterator of the sheets in the workbook | |||
* in sheet order. Includes hidden and very hidden sheets. | |||
* | |||
* @return a spliterator of the sheets. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<Sheet> spliterator() { | |||
return _wb.spliterator(); | |||
} | |||
protected final class SheetIterator<T extends Sheet> implements Iterator<T> { | |||
final private Iterator<XSSFSheet> it; | |||
@SuppressWarnings("unchecked") | |||
@@ -786,15 +800,6 @@ public class SXSSFWorkbook implements Workbook { | |||
} | |||
} | |||
/** | |||
* Alias for {@link #sheetIterator()} to allow | |||
* foreach loops | |||
*/ | |||
@Override | |||
public Iterator<Sheet> iterator() { | |||
return sheetIterator(); | |||
} | |||
/** | |||
* Get the Sheet object at the given index. | |||
* |
@@ -25,6 +25,7 @@ import java.io.OutputStream; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import javax.xml.namespace.QName; | |||
@@ -724,6 +725,14 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing<XSS | |||
return getShapes().iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<XSSFShape> spliterator() { | |||
return getShapes().spliterator(); | |||
} | |||
/** | |||
* @return the sheet associated with the drawing | |||
*/ |
@@ -22,6 +22,7 @@ import java.util.IdentityHashMap; | |||
import java.util.Iterator; | |||
import java.util.Objects; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
import java.util.TreeMap; | |||
import org.apache.poi.ss.SpreadsheetVersion; | |||
@@ -120,18 +121,16 @@ public class XSSFRow implements Row, Comparable<XSSFRow> { | |||
} | |||
/** | |||
* Alias for {@link #cellIterator()} to allow foreach loops: | |||
* <blockquote><pre> | |||
* for(Cell cell : row){ | |||
* ... | |||
* } | |||
* </pre></blockquote> | |||
* Cell spliterator over the physically defined cells | |||
* | |||
* @return an iterator over cells in this row. | |||
* @return a spliterator over cells in this row. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Iterator<Cell> iterator() { | |||
return cellIterator(); | |||
@SuppressWarnings("unchecked") | |||
public Spliterator<Cell> spliterator() { | |||
return (Spliterator<Cell>)(Spliterator<? extends Cell>)_cells.values().spliterator(); | |||
} | |||
/** |
@@ -18,6 +18,7 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import java.util.Iterator; | |||
import java.util.Spliterator; | |||
import org.apache.poi.openxml4j.opc.PackageRelationship; | |||
import org.apache.poi.ss.usermodel.ShapeContainer; | |||
@@ -230,6 +231,14 @@ public final class XSSFShapeGroup extends XSSFShape implements ShapeContainer<XS | |||
return getDrawing().getShapes(this).iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<XSSFShape> spliterator() { | |||
return getDrawing().getShapes(this).spliterator(); | |||
} | |||
@Override | |||
public String getShapeName() { | |||
return ctGroup.getNvGrpSpPr().getCNvPr().getName(); |
@@ -2058,12 +2058,16 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet, OoxmlSheetEx | |||
} | |||
/** | |||
* Alias for {@link #rowIterator()} to | |||
* allow foreach loops | |||
* @return a spliterator of the PHYSICAL rows. Meaning the 3rd element may not | |||
* be the third row if say for instance the second row is undefined. | |||
* Call getRowNum() on each row if you care which one it is. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Iterator<Row> iterator() { | |||
return rowIterator(); | |||
@SuppressWarnings("unchecked") | |||
public Spliterator<Row> spliterator() { | |||
return (Spliterator<Row>)(Spliterator<? extends Row>) _rows.values().spliterator(); | |||
} | |||
/** |
@@ -22,6 +22,7 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import java.util.Optional; | |||
import java.util.Spliterator; | |||
import java.util.function.Function; | |||
import java.util.function.Predicate; | |||
@@ -167,6 +168,14 @@ public class XSSFSimpleShape extends XSSFShape implements Iterable<XSSFTextParag | |||
return _paragraphs.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<XSSFTextParagraph> spliterator() { | |||
return _paragraphs.spliterator(); | |||
} | |||
/** | |||
* Returns the text from all paragraphs in the shape. Paragraphs are | |||
* separated by new lines. |
@@ -35,6 +35,7 @@ import java.util.List; | |||
import java.util.Locale; | |||
import java.util.Map; | |||
import java.util.NoSuchElementException; | |||
import java.util.Spliterator; | |||
import java.util.regex.Pattern; | |||
import javax.xml.namespace.QName; | |||
@@ -1269,6 +1270,20 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su | |||
return sheetIterator(); | |||
} | |||
/** | |||
* Returns a spliterator of the sheets in the workbook | |||
* in sheet order. Includes hidden and very hidden sheets. | |||
* | |||
* @return a spliterator of the sheets. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
@SuppressWarnings("unchecked") | |||
public Spliterator<Sheet> spliterator() { | |||
return (Spliterator<Sheet>)(Spliterator<? extends Sheet>) sheets.spliterator(); | |||
} | |||
private final class SheetIterator<T extends Sheet> implements Iterator<T> { | |||
final private Iterator<T> it; | |||
@SuppressWarnings("unchecked") |
@@ -20,6 +20,7 @@ import java.math.BigInteger; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import org.apache.poi.ooxml.POIXMLDocumentPart; | |||
import org.apache.poi.util.Internal; | |||
@@ -112,6 +113,17 @@ public abstract class XWPFAbstractFootnoteEndnote implements Iterable<XWPFParag | |||
return paragraphs.iterator(); | |||
} | |||
/** | |||
* Get a spliterator over the {@link XWPFParagraph}s in the footnote. | |||
* @return Spliterator over the paragraph list. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<XWPFParagraph> spliterator() { | |||
return paragraphs.spliterator(); | |||
} | |||
/** | |||
* Get the list of {@link XWPFTable}s in the footnote. | |||
* @return List of tables |
@@ -32,6 +32,7 @@ import java.util.Iterator; | |||
import java.util.LinkedList; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Spliterator; | |||
import javax.xml.namespace.QName; | |||
@@ -348,6 +349,15 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { | |||
return bodyElements.iterator(); | |||
} | |||
/** | |||
* returns a Spliterator with paragraphs and tables | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
public Spliterator<IBodyElement> getBodyElementsSpliterator() { | |||
return bodyElements.spliterator(); | |||
} | |||
@Override | |||
public List<XWPFParagraph> getParagraphs() { | |||
return Collections.unmodifiableList(paragraphs); | |||
@@ -1582,10 +1592,24 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { | |||
return tables.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
public Spliterator<XWPFTable> getTablesSpliterator() { | |||
return tables.spliterator(); | |||
} | |||
public Iterator<XWPFParagraph> getParagraphsIterator() { | |||
return paragraphs.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
public Spliterator<XWPFParagraph> getParagraphsSpliterator() { | |||
return paragraphs.spliterator(); | |||
} | |||
/** | |||
* Returns the paragraph that of position pos | |||
*/ |
@@ -179,7 +179,9 @@ public final class TestSXSSFSheet extends BaseTestXSheet { | |||
assertEquals(2, row0.getRowNum(), "Row 2 knows its row number"); | |||
assertEquals(1, sheet.getRowNum(row1), "Sheet knows Row 1's row number"); | |||
assertEquals(2, sheet.getRowNum(row0), "Sheet knows Row 2's row number"); | |||
assertEquals(row1, sheet.iterator().next(), "Sheet row iteratation order should be ascending"); | |||
assertEquals(row1, sheet.iterator().next(), "Sheet row iteration order should be ascending"); | |||
sheet.spliterator().tryAdvance(row -> | |||
assertEquals(row1, row, "Sheet row iteration order should be ascending")); | |||
wb.close(); | |||
} |
@@ -25,6 +25,7 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Optional; | |||
import java.util.Spliterator; | |||
import java.util.function.Function; | |||
import java.util.function.Predicate; | |||
import java.util.function.Supplier; | |||
@@ -85,6 +86,14 @@ public final class PPDrawing extends RecordAtom implements Iterable<EscherRecord | |||
return getEscherRecords().iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<EscherRecord> spliterator() { | |||
return getEscherRecords().spliterator(); | |||
} | |||
/** | |||
* Get access to the atoms inside Textboxes | |||
*/ |
@@ -21,6 +21,7 @@ import java.awt.geom.Rectangle2D; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import org.apache.logging.log4j.LogManager; | |||
import org.apache.logging.log4j.Logger; | |||
@@ -261,6 +262,14 @@ implements HSLFShapeContainer, GroupShape<HSLFShape,HSLFTextParagraph> { | |||
return getShapes().iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<HSLFShape> spliterator() { | |||
return getShapes().spliterator(); | |||
} | |||
@Override | |||
public boolean removeShape(HSLFShape shape) { | |||
// TODO: implement! |
@@ -22,6 +22,7 @@ import java.awt.geom.Rectangle2D; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import org.apache.poi.ddf.EscherContainerRecord; | |||
import org.apache.poi.ddf.EscherDgRecord; | |||
@@ -360,6 +361,13 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet<HSLFShape,H | |||
return getShapes().iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<HSLFShape> spliterator() { | |||
return getShapes().spliterator(); | |||
} | |||
/** | |||
* @return whether shapes on the master sheet should be shown. By default master graphics is turned off. |
@@ -26,6 +26,7 @@ import java.util.ArrayList; | |||
import java.util.Arrays; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import java.util.function.Consumer; | |||
import java.util.stream.Collectors; | |||
@@ -341,6 +342,14 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFShape,HSLFText | |||
return _runs.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<HSLFTextRun> spliterator() { | |||
return _runs.spliterator(); | |||
} | |||
@Override | |||
public Double getLeftMargin() { | |||
Integer val = null; |
@@ -28,6 +28,7 @@ import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import org.apache.logging.log4j.LogManager; | |||
import org.apache.logging.log4j.Logger; | |||
@@ -704,6 +705,14 @@ implements TextShape<HSLFShape,HSLFTextParagraph> { | |||
return _paragraphs.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<HSLFTextParagraph> spliterator() { | |||
return _paragraphs.spliterator(); | |||
} | |||
@Override | |||
public Insets2D getInsets() { | |||
return new Insets2D(getTopInset(), getLeftInset(), getBottomInset(), getRightInset()); |
@@ -20,6 +20,8 @@ package org.apache.poi.ddf; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
import java.util.NoSuchElementException; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
import java.util.function.Supplier; | |||
import java.util.stream.Collectors; | |||
import java.util.stream.StreamSupport; | |||
@@ -263,6 +265,14 @@ public final class EscherArrayProperty extends EscherComplexProperty implements | |||
}; | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<byte[]> spliterator() { | |||
return Spliterators.spliterator(iterator(), getNumberOfElementsInArray(), 0); | |||
} | |||
@Override | |||
public Map<String, Supplier<?>> getGenericProperties() { | |||
return GenericRecordUtil.getGenericProperties( |
@@ -23,6 +23,7 @@ import java.util.Collections; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Spliterator; | |||
import java.util.function.Supplier; | |||
import org.apache.logging.log4j.LogManager; | |||
@@ -170,6 +171,15 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl | |||
return Collections.unmodifiableList(_childRecords).iterator(); | |||
} | |||
/** | |||
* @return a spliterator over the child records | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<EscherRecord> spliterator() { | |||
return _childRecords.spliterator(); | |||
} | |||
/** | |||
* replaces the internal child list with the contents of the supplied {@code childRecords} |
@@ -21,6 +21,7 @@ import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
import java.util.Spliterator; | |||
import java.util.function.Supplier; | |||
import org.apache.poi.common.usermodel.GenericRecord; | |||
@@ -146,6 +147,13 @@ public abstract class PageBreakRecord extends StandardRecord { | |||
return _breaks.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
public final Spliterator<Break> getBreaksSpliterator() { | |||
return _breaks.spliterator(); | |||
} | |||
/** | |||
* Adds the page break at the specified parameters | |||
* @param main Depending on sid, will determine row or column to put page break (zero-based) |
@@ -21,6 +21,7 @@ import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Spliterator; | |||
import java.util.TreeMap; | |||
import org.apache.poi.hssf.model.RecordStream; | |||
@@ -307,6 +308,13 @@ public final class RowRecordsAggregate extends RecordAggregate { | |||
return _rowRecords.values().iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
public Spliterator<RowRecord> getSpliterator() { | |||
return _rowRecords.values().spliterator(); | |||
} | |||
public int findStartOfRowOutlineGroup(int row) { | |||
// Find the start of the group. | |||
RowRecord rowRecord = this.getRow( row ); | |||
@@ -461,6 +469,15 @@ public final class RowRecordsAggregate extends RecordAggregate { | |||
return _valuesAgg.iterator(); | |||
} | |||
/** | |||
* Returns a spliterator for the cell values | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
public Spliterator<CellValueRecordInterface> getCellValueSpliterator() { | |||
return _valuesAgg.spliterator(); | |||
} | |||
public IndexRecord createIndexRecord(int indexRecordOffset, int sizeOfInitialSheetRecords) { | |||
IndexRecord result = new IndexRecord(); | |||
result.setFirstRow(_firstrow); |
@@ -19,6 +19,8 @@ package org.apache.poi.hssf.record.aggregates; | |||
import java.util.Iterator; | |||
import java.util.NoSuchElementException; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
import org.apache.poi.hssf.model.RecordStream; | |||
import org.apache.poi.hssf.record.BlankRecord; | |||
@@ -354,4 +356,14 @@ public final class ValueRecordsAggregate implements Iterable<CellValueRecordInte | |||
public Iterator<CellValueRecordInterface> iterator() { | |||
return new ValueIterator(); | |||
} | |||
/** | |||
* value spliterator | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<CellValueRecordInterface> spliterator() { | |||
return Spliterators.spliterator(iterator(), getPhysicalNumberOfCells(), 0); | |||
} | |||
} |
@@ -23,6 +23,7 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Objects; | |||
import java.util.Spliterator; | |||
import java.util.function.Supplier; | |||
import java.util.stream.Collectors; | |||
@@ -324,6 +325,16 @@ public class UnicodeString implements Comparable<UnicodeString>, Duplicatable, G | |||
return null; | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
public Spliterator<FormatRun> formatSpliterator() { | |||
if (field_4_format_runs != null) { | |||
return field_4_format_runs.spliterator(); | |||
} | |||
return null; | |||
} | |||
public void removeFormatRun(FormatRun r) { | |||
field_4_format_runs.remove(r); | |||
if (field_4_format_runs.size() == 0) { |
@@ -25,6 +25,7 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
import org.apache.poi.ddf.EscherComplexProperty; | |||
import org.apache.poi.ddf.EscherContainerRecord; | |||
@@ -554,6 +555,14 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing<HSSFShap | |||
return _shapes.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<HSSFShape> spliterator() { | |||
return _shapes.spliterator(); | |||
} | |||
protected HSSFSheet getSheet() { | |||
return _sheet; | |||
} |
@@ -630,14 +630,6 @@ public final class HSSFRow implements Row, Comparable<HSSFRow> { | |||
{ | |||
return new CellIterator(); | |||
} | |||
/** | |||
* Alias for {@link #cellIterator} to allow | |||
* foreach loops | |||
*/ | |||
@Override | |||
public Iterator<Cell> iterator() { | |||
return cellIterator(); | |||
} | |||
/** | |||
* An iterator over the (physical) cells in the row. |
@@ -21,6 +21,7 @@ import java.util.ArrayList; | |||
import java.util.Collections; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import org.apache.poi.ddf.DefaultEscherRecordFactory; | |||
import org.apache.poi.ddf.EscherBoolProperty; | |||
@@ -410,4 +411,12 @@ public class HSSFShapeGroup extends HSSFShape implements HSSFShapeContainer { | |||
public Iterator<HSSFShape> iterator() { | |||
return shapes.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<HSSFShape> spliterator() { | |||
return shapes.spliterator(); | |||
} | |||
} |
@@ -23,6 +23,7 @@ import java.util.Collection; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Spliterator; | |||
import java.util.TreeMap; | |||
import java.util.TreeSet; | |||
@@ -963,15 +964,18 @@ public final class HSSFSheet implements Sheet { | |||
} | |||
/** | |||
* Alias for {@link #rowIterator()} to allow | |||
* foreach loops | |||
* @return a spliterator of the PHYSICAL rows. Meaning the 3rd element may not | |||
* be the third row if say for instance the second row is undefined. | |||
* Call getRowNum() on each row if you care which one it is. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Iterator<Row> iterator() { | |||
return rowIterator(); | |||
@SuppressWarnings("unchecked") // can this clumsy generic syntax be improved? | |||
public Spliterator<Row> spliterator() { | |||
return (Spliterator<Row>)(Spliterator<? extends Row>) _rows.values().spliterator(); | |||
} | |||
/** | |||
* used internally in the API to get the low level Sheet record represented by this | |||
* Object. |
@@ -42,6 +42,7 @@ import java.util.List; | |||
import java.util.Map; | |||
import java.util.NoSuchElementException; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
import java.util.regex.Pattern; | |||
import org.apache.commons.codec.digest.DigestUtils; | |||
@@ -988,12 +989,17 @@ public final class HSSFWorkbook extends POIDocument implements Workbook { | |||
} | |||
/** | |||
* Alias for {@link #sheetIterator()} to allow | |||
* foreach loops | |||
* Returns a spliterator of the sheets in the workbook | |||
* in sheet order. Includes hidden and very hidden sheets. | |||
* | |||
* @return a spliterator of the sheets. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Iterator<Sheet> iterator() { | |||
return sheetIterator(); | |||
@SuppressWarnings("unchecked") | |||
public Spliterator<Sheet> spliterator() { | |||
return (Spliterator<Sheet>)(Spliterator<? extends Sheet>) _sheets.spliterator(); | |||
} | |||
private final class SheetIterator<T extends Sheet> implements Iterator<T> { |
@@ -28,6 +28,7 @@ import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
import org.apache.poi.hpsf.ClassID; | |||
import org.apache.poi.poifs.dev.POIFSViewable; | |||
@@ -553,6 +554,16 @@ public class DirectoryNode | |||
return getEntries(); | |||
} | |||
/** | |||
* Returns a Spliterator over all the entries | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<Entry> spliterator() { | |||
return _entries.spliterator(); | |||
} | |||
/* ********** END begin implementation of POIFSViewable ********** */ | |||
} // end public class DirectoryNode | |||
@@ -31,6 +31,8 @@ import java.util.List; | |||
import java.util.Map; | |||
import java.util.NoSuchElementException; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
import org.apache.poi.hpsf.ClassID; | |||
@@ -115,6 +117,14 @@ public class FilteringDirectoryNode implements DirectoryEntry | |||
return getEntries(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<Entry> spliterator() { | |||
return Spliterators.spliterator(iterator(), getEntryCount(), 0); | |||
} | |||
@Override | |||
public int getEntryCount() { | |||
int size = directory.getEntryCount(); |
@@ -26,6 +26,7 @@ import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
/** | |||
* Directory property | |||
@@ -243,6 +244,18 @@ public class DirectoryProperty extends Property implements Parent, Iterable<Prop | |||
public Iterator<Property> iterator() { | |||
return getChildren(); | |||
} | |||
/** | |||
* Get a spliterator over the children of this Parent; all elements | |||
* are instances of Property. | |||
* | |||
* @return Spliterator of children; may refer to an empty collection | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<Property> spliterator() { | |||
return _children.spliterator(); | |||
} | |||
/** | |||
* Add a new child to the collection of children |
@@ -23,6 +23,7 @@ import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Objects; | |||
import java.util.Spliterator; | |||
/** | |||
* Definition of a custom geometric shape | |||
@@ -110,6 +111,14 @@ public final class CustomGeometry implements Iterable<PathIf>{ | |||
return paths.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<PathIf> spliterator() { | |||
return paths.spliterator(); | |||
} | |||
public Path getTextBounds(){ | |||
return textBounds; | |||
} |
@@ -21,6 +21,8 @@ import java.util.HashMap; | |||
import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
import java.util.regex.Matcher; | |||
import java.util.regex.Pattern; | |||
@@ -123,6 +125,12 @@ public final class LookupUtils { | |||
} | |||
}; | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
default Spliterator<Integer> indexSpliterator() { | |||
return Spliterators.spliterator(indexIterator(), getSize(), 0); | |||
} | |||
default Iterator<Integer> reverseIndexIterator() { | |||
return new Iterator<Integer>() { | |||
int pos = getSize() - 1; | |||
@@ -138,6 +146,12 @@ public final class LookupUtils { | |||
} | |||
}; | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
default Spliterator<Integer> reverseIndexSpliterator() { | |||
return Spliterators.spliterator(reverseIndexIterator(), getSize(), 0); | |||
} | |||
} | |||
private static final class RowVector implements ValueVector { |
@@ -18,6 +18,8 @@ | |||
package org.apache.poi.ss.usermodel; | |||
import java.util.Iterator; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
/** | |||
* High level representation of a row of a spreadsheet. | |||
@@ -211,6 +213,32 @@ public interface Row extends Iterable<Cell> { | |||
*/ | |||
Iterator<Cell> cellIterator(); | |||
/** | |||
* Alias for {@link #cellIterator()} to allow foreach loops: | |||
* <blockquote><pre> | |||
* for(Cell cell : row){ | |||
* ... | |||
* } | |||
* </pre></blockquote> | |||
* | |||
* @return an iterator over cells in this row. | |||
*/ | |||
@Override | |||
default Iterator<Cell> iterator() { | |||
return cellIterator(); | |||
} | |||
/** | |||
* @return Cell spliterator of the physically defined cells. Note element 4 may | |||
* actually be row cell depending on how many are defined! | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
default Spliterator<Cell> spliterator() { | |||
return Spliterators.spliterator(cellIterator(), getPhysicalNumberOfCells(), 0); | |||
} | |||
/** | |||
* Returns the Sheet this row belongs to | |||
* |
@@ -21,6 +21,8 @@ import java.util.Collection; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
import org.apache.poi.ss.util.CellAddress; | |||
import org.apache.poi.ss.util.CellRangeAddress; | |||
@@ -375,6 +377,27 @@ public interface Sheet extends Iterable<Row> { | |||
*/ | |||
Iterator<Row> rowIterator(); | |||
/** | |||
* Alias for {@link #rowIterator()} to allow foreach loops | |||
*/ | |||
@Override | |||
default Iterator<Row> iterator() { | |||
return rowIterator(); | |||
} | |||
/** | |||
* Returns a spliterator of the physical rows | |||
* | |||
* @return a spliterator of the PHYSICAL rows. Meaning the 3rd element may not | |||
* be the third row if say for instance the second row is undefined. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
default Spliterator<Row> spliterator() { | |||
return Spliterators.spliterator(rowIterator(), getPhysicalNumberOfRows(), 0); | |||
} | |||
/** | |||
* Control if Excel should be asked to recalculate all formulas on this sheet | |||
* when the workbook is opened. |
@@ -22,6 +22,8 @@ import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
import org.apache.poi.ss.SpreadsheetVersion; | |||
import org.apache.poi.ss.formula.EvaluationWorkbook; | |||
@@ -220,6 +222,27 @@ public interface Workbook extends Closeable, Iterable<Sheet> { | |||
*/ | |||
Iterator<Sheet> sheetIterator(); | |||
/** | |||
* Alias for {@link #sheetIterator()} to allow foreach loops | |||
*/ | |||
@Override | |||
default Iterator<Sheet> iterator() { | |||
return sheetIterator(); | |||
} | |||
/** | |||
* Returns a spliterator of the sheets in the workbook | |||
* in sheet order. Includes hidden and very hidden sheets. | |||
* | |||
* @return a spliterator of the sheets. | |||
* | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
default Spliterator<Sheet> spliterator() { | |||
return Spliterators.spliterator(sheetIterator(), getNumberOfSheets(), 0); | |||
} | |||
/** | |||
* Get the number of spreadsheets in the workbook | |||
* |
@@ -22,6 +22,8 @@ import java.util.Iterator; | |||
import java.util.Map; | |||
import java.util.NoSuchElementException; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
import java.util.Spliterators; | |||
import java.util.function.Supplier; | |||
import org.apache.poi.common.Duplicatable; | |||
@@ -289,6 +291,15 @@ public abstract class CellRangeAddressBase implements Iterable<CellAddress>, Dup | |||
return new RowMajorCellAddressIterator(this); | |||
} | |||
/** | |||
* Returns a spliterator over the CellAddresses in this cell range in row-major order. | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<CellAddress> spliterator() { | |||
return Spliterators.spliterator(iterator(), getNumberOfCells(), 0); | |||
} | |||
/** | |||
* Iterates over the cell addresses in a cell range in row major order | |||
* |
@@ -20,6 +20,7 @@ package org.apache.poi.ss.util; | |||
import java.lang.reflect.Array; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import java.util.stream.Stream; | |||
import org.apache.poi.ss.usermodel.Cell; | |||
@@ -119,4 +120,12 @@ public final class SSCellRange<K extends Cell> implements CellRange<K> { | |||
public Iterator<K> iterator() { | |||
return Stream.of(_flattenedArray).iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
@Override | |||
public Spliterator<K> spliterator() { | |||
return Stream.of(_flattenedArray).spliterator(); | |||
} | |||
} |
@@ -24,6 +24,7 @@ import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Spliterator; | |||
import org.apache.poi.common.Duplicatable; | |||
@@ -37,7 +38,7 @@ import org.apache.poi.common.Duplicatable; | |||
* update | |||
*/ | |||
public class IntMapper<T> implements Duplicatable { | |||
public class IntMapper<T> implements Duplicatable, Iterable<T> { | |||
private final List<T> elements; | |||
private final Map<T, Integer> valueKeyMap; | |||
@@ -90,6 +91,13 @@ public class IntMapper<T> implements Duplicatable { | |||
return elements.iterator(); | |||
} | |||
/** | |||
* @since POI 5.2.0 | |||
*/ | |||
public Spliterator<T> spliterator() { | |||
return elements.spliterator(); | |||
} | |||
@Override | |||
public IntMapper<T> copy() { | |||
return new IntMapper<>(this); |
@@ -25,10 +25,12 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; | |||
import static org.junit.jupiter.api.Assertions.assertNull; | |||
import static org.junit.jupiter.api.Assertions.assertSame; | |||
import static org.junit.jupiter.api.Assertions.assertTrue; | |||
import static org.junit.jupiter.api.Assertions.fail; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Spliterator; | |||
import org.apache.poi.ddf.EscherBoolProperty; | |||
import org.apache.poi.ddf.EscherContainerRecord; | |||
@@ -700,6 +702,11 @@ class TestDrawingShapes { | |||
assertEquals(s1, iter.next()); | |||
assertEquals(s2, iter.next()); | |||
assertFalse(iter.hasNext()); | |||
Spliterator<HSSFShape> spliter = patriarch.spliterator(); | |||
spliter.tryAdvance(s -> assertEquals(s1, s)); | |||
spliter.tryAdvance(s -> assertEquals(s2, s)); | |||
assertFalse(spliter.tryAdvance(s -> fail())); | |||
} | |||
} | |||
@@ -63,6 +63,9 @@ final class TestDirectoryNode { | |||
} | |||
assertEquals(0, count); | |||
// verify that spliterator behaves correctly | |||
assertEquals(0, node.spliterator().getExactSizeIfKnown()); | |||
// verify behavior of isEmpty | |||
assertTrue(node.isEmpty()); | |||
@@ -111,6 +114,9 @@ final class TestDirectoryNode { | |||
} | |||
assertEquals(2, count); | |||
// verify that spliterator behaves correctly | |||
assertEquals(2, node.spliterator().getExactSizeIfKnown()); | |||
// verify behavior of isEmpty | |||
assertFalse(node.isEmpty()); | |||
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; | |||
import static org.junit.jupiter.api.Assertions.assertFalse; | |||
import static org.junit.jupiter.api.Assertions.assertThrows; | |||
import static org.junit.jupiter.api.Assertions.assertTrue; | |||
import static org.junit.jupiter.api.Assertions.fail; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.FileNotFoundException; | |||
@@ -30,6 +31,7 @@ import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.NoSuchElementException; | |||
import java.util.Spliterator; | |||
import org.junit.jupiter.api.BeforeEach; | |||
import org.junit.jupiter.api.Test; | |||
@@ -77,6 +79,12 @@ final class TestFilteringDirectoryNode { | |||
assertEquals(dirB, i.next()); | |||
assertEquals(eRoot, i.next()); | |||
assertThrows(NoSuchElementException.class, i::next, "Should throw NoSuchElementException when depleted"); | |||
Spliterator<Entry> s = d.spliterator(); | |||
s.tryAdvance(entry -> assertEquals(dirA, entry)); | |||
s.tryAdvance(entry -> assertEquals(dirB, entry)); | |||
s.tryAdvance(entry -> assertEquals(eRoot, entry)); | |||
assertFalse(s.tryAdvance(entry -> fail("Should be depleted")), "Should return false when depleted"); | |||
} | |||
@Test | |||
@@ -98,6 +106,11 @@ final class TestFilteringDirectoryNode { | |||
assertEquals(dirB, i.next()); | |||
assertThrows(NoSuchElementException.class, i::next, "Should throw NoSuchElementException when depleted"); | |||
Spliterator<Entry> s1 = d1.spliterator(); | |||
s1.tryAdvance(entry -> assertEquals(dirA, entry)); | |||
s1.tryAdvance(entry -> assertEquals(dirB, entry)); | |||
assertFalse(s1.tryAdvance(entry -> fail("Should be depleted")), "Should return false when depleted"); | |||
// Filter more | |||
excl = Arrays.asList("NotThere", "AlsoNotThere", eRoot.getName(), dirA.getName()); | |||
@@ -115,6 +128,10 @@ final class TestFilteringDirectoryNode { | |||
assertEquals(dirB, i.next()); | |||
assertThrows(NoSuchElementException.class, i::next, "Should throw NoSuchElementException when depleted"); | |||
Spliterator<Entry> s2 = d2.spliterator(); | |||
s2.tryAdvance(entry -> assertEquals(dirB, entry)); | |||
assertFalse(s2.tryAdvance(entry -> fail("Should be depleted")), "Should return false when depleted"); | |||
// Filter everything | |||
excl = Arrays.asList("NotThere", eRoot.getName(), dirA.getName(), dirB.getName()); | |||
FilteringDirectoryNode d3 = new FilteringDirectoryNode(fs.getRoot(), excl); | |||
@@ -129,6 +146,9 @@ final class TestFilteringDirectoryNode { | |||
i = d3.getEntries(); | |||
assertThrows(NoSuchElementException.class, i::next, "Should throw NoSuchElementException when depleted"); | |||
Spliterator<Entry> s3 = d3.spliterator(); | |||
assertFalse(s3.tryAdvance(entry -> fail("Should be depleted")), "Should return false when depleted"); | |||
} | |||
@Test |
@@ -110,6 +110,7 @@ final class TestDirectoryProperty { | |||
children.add(iter.next()); | |||
} | |||
assertEquals(count, children.size()); | |||
assertEquals(count, _property.spliterator().getExactSizeIfKnown()); | |||
if (count != 0) | |||
{ | |||
boolean[] found = new boolean[ count ]; |
@@ -24,7 +24,9 @@ import static org.junit.jupiter.api.Assertions.assertSame; | |||
import java.awt.geom.Path2D; | |||
import java.awt.geom.Rectangle2D; | |||
import java.util.stream.StreamSupport; | |||
import org.junit.jupiter.api.Assertions; | |||
import org.junit.jupiter.api.Test; | |||
class TestPresetGeometries { | |||
@@ -41,6 +43,9 @@ class TestPresetGeometries { | |||
Path2D path = p.getPath(ctx); | |||
assertNotNull(path); | |||
} | |||
StreamSupport.stream(geom.spliterator(), true) | |||
.map(p -> p.getPath(ctx)) | |||
.forEach(Assertions::assertNotNull); | |||
} | |||
// we get the same instance on further calls |
@@ -25,9 +25,11 @@ import static org.junit.jupiter.api.Assertions.assertNull; | |||
import static org.junit.jupiter.api.Assertions.assertSame; | |||
import static org.junit.jupiter.api.Assertions.assertThrows; | |||
import static org.junit.jupiter.api.Assertions.assertTrue; | |||
import static org.junit.jupiter.api.Assertions.fail; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
import java.util.Spliterator; | |||
import org.apache.poi.ss.ITestDataProvider; | |||
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy; | |||
@@ -408,6 +410,54 @@ public abstract class BaseTestRow { | |||
wb.close(); | |||
} | |||
/** | |||
* Test adding cells to a row in various places and see if we can find them again. | |||
*/ | |||
@Test | |||
void testSpliterator() throws IOException { | |||
Workbook wb = _testDataProvider.createWorkbook(); | |||
Sheet sheet = wb.createSheet(); | |||
Row row = sheet.createRow(0); | |||
// One cell at the beginning | |||
Cell cell1 = row.createCell(1); | |||
Spliterator<Cell> split = row.spliterator(); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell1, cell))); | |||
assertFalse(split.tryAdvance(cell -> fail())); | |||
// Add another cell at the end | |||
Cell cell2 = row.createCell(99); | |||
split = row.spliterator(); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell1, cell))); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell2, cell))); | |||
// Add another cell at the beginning | |||
Cell cell3 = row.createCell(0); | |||
split = row.spliterator(); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell3, cell))); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell1, cell))); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell2, cell))); | |||
// Replace cell1 | |||
Cell cell4 = row.createCell(1); | |||
split = row.spliterator(); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell3, cell))); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell4, cell))); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell2, cell))); | |||
assertFalse(split.tryAdvance(cell -> fail())); | |||
// Add another cell, specifying the cellType | |||
Cell cell5 = row.createCell(2, CellType.STRING); | |||
split = row.spliterator(); | |||
assertNotNull(cell5); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell3, cell))); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell4, cell))); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell5, cell))); | |||
assertTrue(split.tryAdvance(cell -> assertSame(cell2, cell))); | |||
assertEquals(CellType.STRING, cell5.getCellType()); | |||
wb.close(); | |||
} | |||
@Test | |||
void testRowStyle() throws IOException { | |||
Workbook wb1 = _testDataProvider.createWorkbook(); |
@@ -37,6 +37,7 @@ import java.util.Iterator; | |||
import java.util.Map; | |||
import java.util.Map.Entry; | |||
import java.util.Set; | |||
import java.util.Spliterator; | |||
import org.apache.poi.common.usermodel.HyperlinkType; | |||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
@@ -83,6 +84,9 @@ public abstract class BaseTestSheet { | |||
assertSame(row1, it.next()); | |||
assertTrue(it.hasNext()); | |||
assertSame(row2, it.next()); | |||
Spliterator<Row> split = sheet.spliterator(); | |||
assertTrue(split.tryAdvance(row -> assertSame(row1, row))); | |||
assertTrue(split.tryAdvance(row -> assertSame(row2, row))); | |||
assertEquals(1, sheet.getLastRowNum()); | |||
// Test row creation with non consecutive index | |||
@@ -102,6 +106,12 @@ public abstract class BaseTestSheet { | |||
Row row2_ovrewritten_ref = it2.next(); | |||
assertSame(row2_ovrewritten, row2_ovrewritten_ref); | |||
assertEquals(100.0, row2_ovrewritten_ref.getCell(0).getNumericCellValue(), 0.0); | |||
Spliterator<Row> split2 = sheet.spliterator(); | |||
assertTrue(split2.tryAdvance(row -> assertSame(row1, row))); | |||
assertTrue(split2.tryAdvance(row -> { | |||
assertSame(row2_ovrewritten, row); | |||
assertEquals(100.0, row.getCell(0).getNumericCellValue(), 0.0); | |||
})); | |||
} | |||
} | |||
@@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; | |||
import java.io.IOException; | |||
import java.util.ConcurrentModificationException; | |||
import java.util.Iterator; | |||
import java.util.Spliterator; | |||
import org.apache.poi.hssf.HSSFTestDataSamples; | |||
import org.apache.poi.ss.ITestDataProvider; | |||
@@ -74,11 +75,15 @@ public abstract class BaseTestWorkbook { | |||
wb.createSheet("Sheet2"); | |||
Iterator<Sheet> it = wb.sheetIterator(); | |||
Spliterator<Sheet> split = wb.spliterator(); | |||
it.next(); | |||
split.tryAdvance(sheet -> {}); | |||
wb.setSheetOrder("Sheet2", 1); | |||
// Iterator order should be fixed when iterator is created | |||
assertThrows(ConcurrentModificationException.class, it::next); | |||
// Spliterator order should be fixed when spliterator is created | |||
assertThrows(ConcurrentModificationException.class, () -> split.tryAdvance(sheet -> {})); | |||
} | |||
} | |||
@@ -95,10 +100,15 @@ public abstract class BaseTestWorkbook { | |||
wb.createSheet("Sheet2"); | |||
Iterator<Sheet> it = wb.sheetIterator(); | |||
Spliterator<Sheet> split = wb.spliterator(); | |||
it.next(); | |||
split.tryAdvance(sheet -> {}); | |||
wb.removeSheetAt(1); | |||
// Iterator order should be fixed when iterator is created | |||
assertThrows(ConcurrentModificationException.class, it::next); | |||
// Spliterator order should be fixed when spliterator is created | |||
assertThrows(ConcurrentModificationException.class, () -> split.tryAdvance(sheet -> {})); | |||
} | |||
} | |||
@@ -28,10 +28,13 @@ import static org.junit.jupiter.api.Assertions.fail; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
import java.util.NoSuchElementException; | |||
import java.util.Spliterator; | |||
import java.util.stream.StreamSupport; | |||
import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; | |||
import org.apache.poi.hssf.record.TestcaseRecordInputStream; | |||
import org.apache.poi.util.LittleEndianOutputStream; | |||
import org.junit.jupiter.api.Assertions; | |||
import org.junit.jupiter.api.Test; | |||
final class TestCellRangeAddress { | |||
@@ -275,6 +278,29 @@ final class TestCellRangeAddress { | |||
assertEquals(4, count); | |||
} | |||
@Test | |||
void spliterator() { | |||
final CellRangeAddress A1_B2 = new CellRangeAddress(0, 1, 0, 1); | |||
// the cell address iterator iterates in row major order | |||
final Spliterator<CellAddress> spliter = A1_B2.spliterator(); | |||
spliter.tryAdvance(addr -> | |||
assertEquals(new CellAddress(0, 0), addr, "A1")); | |||
spliter.tryAdvance(addr -> | |||
assertEquals(new CellAddress(0, 1), addr, "B1")); | |||
spliter.tryAdvance(addr -> | |||
assertEquals(new CellAddress(1, 0), addr, "A2")); | |||
spliter.tryAdvance(addr -> | |||
assertEquals(new CellAddress(1, 1), addr, "B2")); | |||
assertFalse(spliter.tryAdvance(addr -> fail())); | |||
// stream | |||
long count = StreamSupport.stream(A1_B2.spliterator(), false) | |||
.peek(Assertions::assertNotNull) | |||
.count(); | |||
assertEquals(4, count); | |||
} | |||
private static void assertIntersects(CellRangeAddress regionA, CellRangeAddress regionB) { | |||
if (!(regionA.intersects(regionB) && regionB.intersects(regionA))) { | |||
final String A = regionA.formatAsString(); |