git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1751131 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_15_BETA3
@@ -60,9 +60,8 @@ public abstract class BooleanFunction implements Function { | |||
/* | |||
* Note: no short-circuit boolean loop exit because any ErrorEvals will override the result | |||
*/ | |||
for (int i=0, iSize=args.length; i<iSize; i++) { | |||
for (final ValueEval arg : args) { | |||
Boolean tempVe; | |||
ValueEval arg = args[i]; | |||
if (arg instanceof TwoDEval) { | |||
TwoDEval ae = (TwoDEval) arg; | |||
int height = ae.getHeight(); | |||
@@ -81,7 +80,9 @@ public abstract class BooleanFunction implements Function { | |||
} | |||
if (arg instanceof RefEval) { | |||
RefEval re = (RefEval) arg; | |||
for (int sIx = re.getFirstSheetIndex(); sIx <= re.getLastSheetIndex(); sIx++) { | |||
final int firstSheetIndex = re.getFirstSheetIndex(); | |||
final int lastSheetIndex = re.getLastSheetIndex(); | |||
for (int sIx = firstSheetIndex; sIx <= lastSheetIndex; sIx++) { | |||
ValueEval ve = re.getInnerValueEval(sIx); | |||
tempVe = OperandResolver.coerceValueToBoolean(ve, true); | |||
if (tempVe != null) { |
@@ -49,7 +49,9 @@ final class CountUtils { | |||
public static int countMatchingCellsInArea(ThreeDEval areaEval, I_MatchPredicate criteriaPredicate) { | |||
int result = 0; | |||
for (int sIx=areaEval.getFirstSheetIndex(); sIx <= areaEval.getLastSheetIndex(); sIx++) { | |||
final int firstSheetIndex = areaEval.getFirstSheetIndex(); | |||
final int lastSheetIndex = areaEval.getLastSheetIndex(); | |||
for (int sIx = firstSheetIndex; sIx <= lastSheetIndex; sIx++) { | |||
int height = areaEval.getHeight(); | |||
int width = areaEval.getWidth(); | |||
for (int rrIx=0; rrIx<height; rrIx++) { | |||
@@ -75,7 +77,9 @@ final class CountUtils { | |||
public static int countMatchingCellsInRef(RefEval refEval, I_MatchPredicate criteriaPredicate) { | |||
int result = 0; | |||
for (int sIx = refEval.getFirstSheetIndex(); sIx <= refEval.getLastSheetIndex(); sIx++) { | |||
final int firstSheetIndex = refEval.getFirstSheetIndex(); | |||
final int lastSheetIndex = refEval.getLastSheetIndex(); | |||
for (int sIx = firstSheetIndex; sIx <= lastSheetIndex; sIx++) { | |||
ValueEval ve = refEval.getInnerValueEval(sIx); | |||
if(criteriaPredicate.matches(ve)) { | |||
result++; |
@@ -89,7 +89,8 @@ public final class DStarRunner implements Function3Arg { | |||
} | |||
// Iterate over all DB entries. | |||
for(int row = 1; row < db.getHeight(); ++row) { | |||
final int height = db.getHeight(); | |||
for(int row = 1; row < height; ++row) { | |||
boolean matches = true; | |||
try { | |||
matches = fullfillsConditions(db, row, cdb); | |||
@@ -189,7 +190,8 @@ public final class DStarRunner implements Function3Arg { | |||
private static int getColumnForString(TwoDEval db,String name) | |||
throws EvaluationException { | |||
int resultColumn = -1; | |||
for(int column = 0; column < db.getWidth(); ++column) { | |||
final int width = db.getWidth(); | |||
for(int column = 0; column < width; ++column) { | |||
ValueEval columnNameValueEval = db.getValue(0, column); | |||
String columnName = getStringFromValueEval(columnNameValueEval); | |||
if(name.equals(columnName)) { | |||
@@ -215,9 +217,11 @@ public final class DStarRunner implements Function3Arg { | |||
// Only one row must match to accept the input, so rows are ORed. | |||
// Each row is made up of cells where each cell is a condition, | |||
// all have to match, so they are ANDed. | |||
for(int conditionRow = 1; conditionRow < cdb.getHeight(); ++conditionRow) { | |||
final int height = cdb.getHeight(); | |||
for(int conditionRow = 1; conditionRow < height; ++conditionRow) { | |||
boolean matches = true; | |||
for(int column = 0; column < cdb.getWidth(); ++column) { // columns are ANDed | |||
final int width = cdb.getWidth(); | |||
for(int column = 0; column < width; ++column) { // columns are ANDed | |||
// Whether the condition column matches a database column, if not it's a | |||
// special column that accepts formulas. | |||
boolean columnCondition = true; |
@@ -106,7 +106,9 @@ public final class Mode implements Function { | |||
} | |||
if (arg instanceof RefEval) { | |||
RefEval re = (RefEval) arg; | |||
for (int sIx = re.getFirstSheetIndex(); sIx <= re.getLastSheetIndex(); sIx++) { | |||
final int firstSheetIndex = re.getFirstSheetIndex(); | |||
final int lastSheetIndex = re.getLastSheetIndex(); | |||
for (int sIx = firstSheetIndex; sIx <= lastSheetIndex; sIx++) { | |||
collectValue(re.getInnerValueEval(sIx), temp, true); | |||
} | |||
return; |
@@ -126,9 +126,10 @@ public abstract class TextFunction implements Function { | |||
protected ValueEval evaluate(String text) { | |||
StringBuilder sb = new StringBuilder(); | |||
boolean shouldMakeUppercase = true; | |||
String lowercaseText = text.toLowerCase(Locale.ROOT); | |||
String uppercaseText = text.toUpperCase(Locale.ROOT); | |||
for(int i = 0; i < text.length(); ++i) { | |||
final String lowercaseText = text.toLowerCase(Locale.ROOT); | |||
final String uppercaseText = text.toUpperCase(Locale.ROOT); | |||
final int length = text.length(); | |||
for(int i = 0; i < length; ++i) { | |||
if (shouldMakeUppercase) { | |||
sb.append(uppercaseText.charAt(i)); | |||
} |
@@ -169,18 +169,18 @@ public final class ArrayPtg extends Ptg { | |||
public String toFormulaString() { | |||
StringBuffer b = new StringBuffer(); | |||
b.append("{"); | |||
for (int y=0;y<getRowCount();y++) { | |||
for (int y = 0; y < _nRows; y++) { | |||
if (y > 0) { | |||
b.append(";"); | |||
} | |||
for (int x=0;x<getColumnCount();x++) { | |||
if (x > 0) { | |||
for (int x = 0; x < _nColumns; x++) { | |||
if (x > 0) { | |||
b.append(","); | |||
} | |||
Object o = _arrayValues[getValueIndex(x, y)]; | |||
b.append(getConstantText(o)); | |||
} | |||
} | |||
Object o = _arrayValues[getValueIndex(x, y)]; | |||
b.append(getConstantText(o)); | |||
} | |||
} | |||
b.append("}"); | |||
return b.toString(); | |||
} |
@@ -563,8 +563,7 @@ public class DataFormatter implements Observer { | |||
else if (c == 's' || c == 'S') { | |||
sb.append('s'); | |||
// if 'M' precedes 's' it should be minutes ('m') | |||
for (int i = 0; i < ms.size(); i++) { | |||
int index = ms.get(i).intValue(); | |||
for (int index : ms) { | |||
if (sb.charAt(index) == 'M') { | |||
sb.replace(index, index+1, "m"); | |||
} |
@@ -395,10 +395,11 @@ public class DateUtil { | |||
// The code above was reworked as suggested in bug 48425: | |||
// simple loop is more efficient than consecutive regexp replacements. | |||
}*/ | |||
StringBuilder sb = new StringBuilder(fs.length()); | |||
for (int i = 0; i < fs.length(); i++) { | |||
final int length = fs.length(); | |||
StringBuilder sb = new StringBuilder(length); | |||
for (int i = 0; i < length; i++) { | |||
char c = fs.charAt(i); | |||
if (i < fs.length() - 1) { | |||
if (i < length - 1) { | |||
char nc = fs.charAt(i + 1); | |||
if (c == '\\') { | |||
switch (nc) { | |||
@@ -435,8 +436,9 @@ public class DateUtil { | |||
// You're allowed something like dd/mm/yy;[red]dd/mm/yy | |||
// which would place dates before 1900/1904 in red | |||
// For now, only consider the first one | |||
if(fs.indexOf(';') > 0 && fs.indexOf(';') < fs.length()-1) { | |||
fs = fs.substring(0, fs.indexOf(';')); | |||
final int separatorIndex = fs.indexOf(';'); | |||
if(0 < separatorIndex && separatorIndex < fs.length()-1) { | |||
fs = fs.substring(0, separatorIndex); | |||
} | |||
// Ensure it has some date letters in it |
@@ -101,7 +101,7 @@ public class AreaReference { | |||
} | |||
} | |||
private boolean isPlainColumn(String refPart) { | |||
private static boolean isPlainColumn(String refPart) { | |||
for(int i=refPart.length()-1; i>=0; i--) { | |||
int ch = refPart.charAt(i); | |||
if (ch == '$' && i==0) { |
@@ -27,6 +27,7 @@ import java.nio.charset.Charset; | |||
import org.apache.poi.hssf.usermodel.HSSFSheet; | |||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; | |||
import org.apache.poi.ss.usermodel.Sheet; | |||
/** | |||
* Dump out the aggregated escher records | |||
@@ -42,11 +43,11 @@ public class DrawingDump | |||
pw.println( "Drawing group:" ); | |||
wb.dumpDrawingGroupRecords(true); | |||
for (int sheetNum = 1; sheetNum <= wb.getNumberOfSheets(); sheetNum++) | |||
int i = 1; | |||
for (Sheet sheet : wb) | |||
{ | |||
pw.println( "Sheet " + sheetNum + ":" ); | |||
HSSFSheet sheet = wb.getSheetAt(sheetNum - 1); | |||
sheet.dumpDrawingRecords(true, pw); | |||
pw.println( "Sheet " + i + "(" + sheet.getSheetName() + "):" ); | |||
((HSSFSheet) sheet).dumpDrawingRecords(true, pw); | |||
} | |||
} finally { | |||
wb.close(); |
@@ -271,8 +271,7 @@ public class StringUtil { | |||
public static boolean hasMultibyte(String value) { | |||
if (value == null) | |||
return false; | |||
for (int i = 0; i < value.length(); i++) { | |||
char c = value.charAt(i); | |||
for (char c : value.toCharArray()) { | |||
if (c > 0xFF) { | |||
return true; | |||
} |
@@ -229,7 +229,8 @@ public class SignatureInfo implements SignatureConfigurable { | |||
Document doc = DocumentHelper.readDocument(signaturePart.getInputStream()); | |||
XPath xpath = XPathFactory.newInstance().newXPath(); | |||
NodeList nl = (NodeList)xpath.compile("//*[@Id]").evaluate(doc, XPathConstants.NODESET); | |||
for (int i=0; i<nl.getLength(); i++) { | |||
final int length = nl.getLength(); | |||
for (int i=0; i<length; i++) { | |||
((Element)nl.item(i)).setIdAttribute("Id", true); | |||
} | |||
@@ -242,6 +243,7 @@ public class SignatureInfo implements SignatureConfigurable { | |||
XMLSignature xmlSignature = xmlSignatureFactory.unmarshalXMLSignature(domValidateContext); | |||
// TODO: replace with property when xml-sec patch is applied | |||
// workaround added in r1637283 2014-11-07 | |||
for (Reference ref : (List<Reference>)xmlSignature.getSignedInfo().getReferences()) { | |||
SignatureFacet.brokenJvmWorkaround(ref); | |||
} |
@@ -23,6 +23,7 @@ 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.Row; | |||
import org.apache.poi.ss.usermodel.Sheet; | |||
import org.apache.poi.util.POILogFactory; | |||
import org.apache.poi.util.POILogger; | |||
import org.apache.poi.xssf.usermodel.BaseXSSFFormulaEvaluator; | |||
@@ -100,26 +101,24 @@ public final class SXSSFFormulaEvaluator extends BaseXSSFFormulaEvaluator { | |||
SXSSFFormulaEvaluator eval = new SXSSFFormulaEvaluator(wb); | |||
// Check they're all available | |||
for (int i=0; i<wb.getNumberOfSheets(); i++) { | |||
SXSSFSheet s = wb.getSheetAt(i); | |||
if (s.areAllRowsFlushed()) { | |||
for (Sheet sheet : wb) { | |||
if (((SXSSFSheet)sheet).areAllRowsFlushed()) { | |||
throw new SheetsFlushedException(); | |||
} | |||
} | |||
// Process the sheets as best we can | |||
for (int i=0; i<wb.getNumberOfSheets(); i++) { | |||
SXSSFSheet s = wb.getSheetAt(i); | |||
for (Sheet sheet : wb) { | |||
// Check if any rows have already been flushed out | |||
int lastFlushedRowNum = s.getLastFlushedRowNum(); | |||
int lastFlushedRowNum = ((SXSSFSheet) sheet).getLastFlushedRowNum(); | |||
if (lastFlushedRowNum > -1) { | |||
if (! skipOutOfWindow) throw new RowFlushedException(0); | |||
logger.log(POILogger.INFO, "Rows up to " + lastFlushedRowNum + " have already been flushed, skipping"); | |||
} | |||
// Evaluate what we have | |||
for (Row r : s) { | |||
for (Row r : sheet) { | |||
for (Cell c : r) { | |||
if (c.getCellType() == Cell.CELL_TYPE_FORMULA) { | |||
eval.evaluateFormulaCell(c); |
@@ -118,11 +118,14 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork | |||
// Not properly referenced | |||
throw new RuntimeException("Book not linked for filename " + bookName); | |||
} | |||
/* case-sensitive */ | |||
private int findExternalLinkIndex(String bookName, List<ExternalLinksTable> tables) { | |||
for (int i=0; i<tables.size(); i++) { | |||
if (tables.get(i).getLinkedFileName().equals(bookName)) { | |||
int i = 0; | |||
for (ExternalLinksTable table : tables) { | |||
if (table.getLinkedFileName().equals(bookName)) { | |||
return i+1; // 1 based results, 0 = current workbook | |||
} | |||
i++; | |||
} | |||
return -1; | |||
} | |||
@@ -131,6 +134,7 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork | |||
private FakeExternalLinksTable(String fileName) { | |||
this.fileName = fileName; | |||
} | |||
@Override | |||
public String getLinkedFileName() { | |||
return fileName; | |||
} |
@@ -58,6 +58,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; | |||
import org.w3c.dom.Node; | |||
import org.w3c.dom.NodeList; | |||
import org.w3c.dom.Text; | |||
@@ -274,9 +275,11 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA | |||
.selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t"); | |||
for (int m = 0; m < t.length; m++) { | |||
NodeList kids = t[m].getDomNode().getChildNodes(); | |||
for (int n = 0; n < kids.getLength(); n++) { | |||
if (kids.item(n) instanceof Text) { | |||
text.append(kids.item(n).getNodeValue()); | |||
final int count = kids.getLength(); | |||
for (int n = 0; n < count; n++) { | |||
Node kid = kids.item(n); | |||
if (kid instanceof Text) { | |||
text.append(kid.getNodeValue()); | |||
} | |||
} | |||
} |
@@ -2804,7 +2804,8 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { | |||
// check row numbers to make sure they are continuous and increasing (monotonic) | |||
// and srcRows does not contain null rows | |||
for (int index=1; index < srcRows.size(); index++) { | |||
final int size = srcRows.size(); | |||
for (int index=1; index < size; index++) { | |||
final Row curRow = srcRows.get(index); | |||
if (curRow == null) { | |||
throw new IllegalArgumentException("srcRows may not contain null rows. Found null row at index " + index + "."); |