diff --git a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java index 7cc140877..03dd9772f 100644 --- a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java +++ b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java @@ -26,54 +26,13 @@ import java.util.TreeSet; import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.WorkbookNotFoundException; import org.apache.poi.ss.formula.atp.AnalysisToolPak; -import org.apache.poi.ss.formula.eval.BlankEval; -import org.apache.poi.ss.formula.eval.BoolEval; -import org.apache.poi.ss.formula.eval.ErrorEval; -import org.apache.poi.ss.formula.eval.EvaluationException; -import org.apache.poi.ss.formula.eval.ExternalNameEval; -import org.apache.poi.ss.formula.eval.FunctionEval; -import org.apache.poi.ss.formula.eval.FunctionNameEval; -import org.apache.poi.ss.formula.eval.MissingArgEval; -import org.apache.poi.ss.formula.eval.NotImplementedException; -import org.apache.poi.ss.formula.eval.NumberEval; -import org.apache.poi.ss.formula.eval.OperandResolver; -import org.apache.poi.ss.formula.eval.StringEval; -import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.formula.eval.*; import org.apache.poi.ss.formula.function.FunctionMetadataRegistry; import org.apache.poi.ss.formula.functions.Choose; import org.apache.poi.ss.formula.functions.FreeRefFunction; import org.apache.poi.ss.formula.functions.Function; import org.apache.poi.ss.formula.functions.IfFunc; -import org.apache.poi.ss.formula.ptg.Area3DPtg; -import org.apache.poi.ss.formula.ptg.Area3DPxg; -import org.apache.poi.ss.formula.ptg.AreaErrPtg; -import org.apache.poi.ss.formula.ptg.AreaPtg; -import org.apache.poi.ss.formula.ptg.AttrPtg; -import org.apache.poi.ss.formula.ptg.BoolPtg; -import org.apache.poi.ss.formula.ptg.ControlPtg; -import org.apache.poi.ss.formula.ptg.DeletedArea3DPtg; -import org.apache.poi.ss.formula.ptg.DeletedRef3DPtg; -import org.apache.poi.ss.formula.ptg.ErrPtg; -import org.apache.poi.ss.formula.ptg.ExpPtg; -import org.apache.poi.ss.formula.ptg.FuncVarPtg; -import org.apache.poi.ss.formula.ptg.IntPtg; -import org.apache.poi.ss.formula.ptg.MemAreaPtg; -import org.apache.poi.ss.formula.ptg.MemErrPtg; -import org.apache.poi.ss.formula.ptg.MemFuncPtg; -import org.apache.poi.ss.formula.ptg.MissingArgPtg; -import org.apache.poi.ss.formula.ptg.NamePtg; -import org.apache.poi.ss.formula.ptg.NameXPtg; -import org.apache.poi.ss.formula.ptg.NameXPxg; -import org.apache.poi.ss.formula.ptg.NumberPtg; -import org.apache.poi.ss.formula.ptg.OperationPtg; -import org.apache.poi.ss.formula.ptg.Ptg; -import org.apache.poi.ss.formula.ptg.Ref3DPtg; -import org.apache.poi.ss.formula.ptg.Ref3DPxg; -import org.apache.poi.ss.formula.ptg.RefErrorPtg; -import org.apache.poi.ss.formula.ptg.RefPtg; -import org.apache.poi.ss.formula.ptg.StringPtg; -import org.apache.poi.ss.formula.ptg.UnionPtg; -import org.apache.poi.ss.formula.ptg.UnknownPtg; +import org.apache.poi.ss.formula.ptg.*; import org.apache.poi.ss.formula.udf.AggregatingUDFFinder; import org.apache.poi.ss.formula.udf.UDFFinder; import org.apache.poi.ss.usermodel.Cell; @@ -795,7 +754,7 @@ public final class WorkbookEvaluator { * * @param name the function name * @param func the functoin to register - * @throws IllegalArgumentException if the function is unknown or already registered. + * @throws IllegalArgumentException if the function is unknown or already registered. * @since 3.8 beta6 */ public static void registerFunction(String name, FreeRefFunction func){ @@ -807,7 +766,7 @@ public final class WorkbookEvaluator { * * @param name the function name * @param func the functoin to register - * @throws IllegalArgumentException if the function is unknown or already registered. + * @throws IllegalArgumentException if the function is unknown or already registered. * @since 3.8 beta6 */ public static void registerFunction(String name, Function func){ diff --git a/src/testcases/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java b/src/testcases/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java index a4849a782..13581c8a4 100644 --- a/src/testcases/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java +++ b/src/testcases/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java @@ -17,8 +17,6 @@ package org.apache.poi.ss.formula.function; -import org.apache.poi.util.TempFile; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -46,6 +44,7 @@ import java.util.zip.ZipFile; import org.apache.poi.poifs.crypt.CryptoFunctions; import org.apache.poi.poifs.crypt.HashAlgorithm; +import org.apache.poi.util.TempFile; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; @@ -152,18 +151,18 @@ public final class ExcelFileFormatDocFunctionExtractor { private static final class FunctionDataCollector { - private final Map _allFunctionsByIndex; - private final Map _allFunctionsByName; - private final Set _groupFunctionIndexes; - private final Set _groupFunctionNames; + private final Map _allFunctionsByIndex; + private final Map _allFunctionsByName; + private final Set _groupFunctionIndexes; + private final Set _groupFunctionNames; private final PrintStream _ps; public FunctionDataCollector(PrintStream ps) { _ps = ps; - _allFunctionsByIndex = new HashMap(); - _allFunctionsByName = new HashMap(); - _groupFunctionIndexes = new HashSet(); - _groupFunctionNames = new HashSet(); + _allFunctionsByIndex = new HashMap(); + _allFunctionsByName = new HashMap(); + _groupFunctionIndexes = new HashSet(); + _groupFunctionNames = new HashSet(); } public void addFuntion(int funcIx, boolean hasFootnote, String funcName, int minParams, int maxParams, @@ -193,7 +192,7 @@ public final class ExcelFileFormatDocFunctionExtractor { private void checkRedefinedFunction(boolean hasNote, String funcName, Integer funcIxKey) { FunctionData fdPrev; // check by index - fdPrev = (FunctionData) _allFunctionsByIndex.get(funcIxKey); + fdPrev = _allFunctionsByIndex.get(funcIxKey); if(fdPrev != null) { if(!fdPrev.hasFootnote() || !hasNote) { throw new RuntimeException("changing function [" @@ -202,7 +201,7 @@ public final class ExcelFileFormatDocFunctionExtractor { _allFunctionsByName.remove(fdPrev.getName()); } // check by name - fdPrev = (FunctionData) _allFunctionsByName.get(funcName); + fdPrev = _allFunctionsByName.get(funcName); if(fdPrev != null) { if(!fdPrev.hasFootnote() || !hasNote) { throw new RuntimeException("changing function '" @@ -221,7 +220,7 @@ public final class ExcelFileFormatDocFunctionExtractor { _ps.println("# " + headingText); for (int i = 0; i < keys.length; i++) { - FunctionData fd = (FunctionData) _allFunctionsByIndex.get(keys[i]); + FunctionData fd = _allFunctionsByIndex.get(keys[i]); _ps.println(fd.formatAsDataLine()); } } @@ -252,13 +251,13 @@ public final class ExcelFileFormatDocFunctionExtractor { }; - private final Stack _elemNameStack; + private final Stack _elemNameStack; /** true only when parsing the target tables */ private boolean _isInsideTable; - private final List _rowData; + private final List _rowData; private final StringBuffer _textNodeBuffer; - private final List _rowNoteFlags; + private final List _rowNoteFlags; private boolean _cellHasNote; private final FunctionDataCollector _fdc; @@ -266,19 +265,21 @@ public final class ExcelFileFormatDocFunctionExtractor { public EFFDocHandler(FunctionDataCollector fdc) { _fdc = fdc; - _elemNameStack = new Stack(); + _elemNameStack = new Stack(); _isInsideTable = false; - _rowData = new ArrayList(); + _rowData = new ArrayList(); _textNodeBuffer = new StringBuffer(); - _rowNoteFlags = new ArrayList(); + _rowNoteFlags = new ArrayList(); } private boolean matchesTargetPath() { return matchesPath(0, TABLE_BASE_PATH_NAMES); } + private boolean matchesRelPath(String[] pathNames) { return matchesPath(TABLE_BASE_PATH_NAMES.length, pathNames); } + private boolean matchesPath(int baseStackIndex, String[] pathNames) { if(_elemNameStack.size() != baseStackIndex + pathNames.length) { return false; @@ -290,15 +291,18 @@ public final class ExcelFileFormatDocFunctionExtractor { } return true; } - public void characters(char[] ch, int start, int length) { + + @Override + public void characters(char[] ch, int start, int length) { // only 2 text nodes where text is collected: if(matchesRelPath(TABLE_CELL_RELPATH_NAMES) || matchesPath(0, HEADING_PATH_NAMES)) { _textNodeBuffer.append(ch, start, length); } } - public void endElement(String namespaceURI, String localName, String name) { - String expectedName = (String) _elemNameStack.peek(); + @Override + public void endElement(String namespaceURI, String localName, String name) { + String expectedName = _elemNameStack.peek(); if(expectedName != name) { throw new RuntimeException("close tag mismatch"); } @@ -335,6 +339,7 @@ public final class ExcelFileFormatDocFunctionExtractor { processFunction(cellData, noteFlags, 0); processFunction(cellData, noteFlags, 8); } + public void processFunction(String[] cellData, Boolean[] noteFlags, int i) { String funcIxStr = cellData[i + 0]; if (funcIxStr.length() < 1) { @@ -354,6 +359,7 @@ public final class ExcelFileFormatDocFunctionExtractor { _fdc.addFuntion(funcIx, hasFootnote, funcName, minParams, maxParams, returnClass, paramClasses, volatileFlagStr); } + private static int parseInt(String valStr) { try { return Integer.parseInt(valStr); @@ -361,7 +367,9 @@ public final class ExcelFileFormatDocFunctionExtractor { throw new RuntimeException("Value '" + valStr + "' could not be parsed as an integer"); } } - public void startElement(String namespaceURI, String localName, String name, Attributes atts) { + + @Override + public void startElement(String namespaceURI, String localName, String name, Attributes atts) { _elemNameStack.add(name); if(matchesTargetPath()) { String tableName = atts.getValue("table:name"); @@ -385,27 +393,35 @@ public final class ExcelFileFormatDocFunctionExtractor { } } - public void endDocument() { + @Override + public void endDocument() { // do nothing } - public void endPrefixMapping(String prefix) { + @Override + public void endPrefixMapping(String prefix) { // do nothing } + @Override public void ignorableWhitespace(char[] ch, int start, int length) { // do nothing } + @Override public void processingInstruction(String target, String data) { // do nothing } + @Override public void setDocumentLocator(Locator locator) { // do nothing } + @Override public void skippedEntity(String name) { // do nothing } + @Override public void startDocument() { // do nothing } + @Override public void startPrefixMapping(String prefix, String uri) { // do nothing } @@ -449,16 +465,21 @@ public final class ExcelFileFormatDocFunctionExtractor { public SimpleAsciiOutputStream(OutputStream os) { _os = os; } - public void write(int b) throws IOException { + + @Override + public void write(int b) throws IOException { checkByte(b); _os.write(b); } + private static void checkByte(int b) { if (!isSimpleAscii((char)b)) { throw new RuntimeException("Encountered char (" + b + ") which was not simple ascii as expected"); } } - public void write(byte[] b, int off, int len) throws IOException { + + @Override + public void write(byte[] b, int off, int len) throws IOException { for (int i = 0; i < len; i++) { checkByte(b[i + off]); @@ -486,7 +507,7 @@ public final class ExcelFileFormatDocFunctionExtractor { } outputLicenseHeader(ps); - Class genClass = ExcelFileFormatDocFunctionExtractor.class; + Class genClass = ExcelFileFormatDocFunctionExtractor.class; ps.println("# Created by (" + genClass.getName() + ")"); // identify the source file ps.print("# from source file '" + SOURCE_DOC_FILE_NAME + "'");