Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 8756B200BEE for ; Sat, 31 Dec 2016 17:53:19 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 85F7E160B28; Sat, 31 Dec 2016 16:53:19 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 81578160B15 for ; Sat, 31 Dec 2016 17:53:18 +0100 (CET) Received: (qmail 26378 invoked by uid 500); 31 Dec 2016 16:53:17 -0000 Mailing-List: contact commits-help@poi.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@poi.apache.org Delivered-To: mailing list commits@poi.apache.org Received: (qmail 26369 invoked by uid 99); 31 Dec 2016 16:53:17 -0000 Received: from Unknown (HELO svn01-us-west.apache.org) (209.188.14.144) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 31 Dec 2016 16:53:17 +0000 Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id 106203A022C for ; Sat, 31 Dec 2016 16:53:16 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1776796 - in /poi/trunk/src: java/org/apache/poi/ss/formula/ ooxml/testcases/org/apache/poi/ss/formula/ testcases/org/apache/poi/hssf/model/ testcases/org/apache/poi/hssf/usermodel/ Date: Sat, 31 Dec 2016 16:53:16 -0000 To: commits@poi.apache.org From: centic@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20161231165317.106203A022C@svn01-us-west.apache.org> archived-at: Sat, 31 Dec 2016 16:53:19 -0000 Author: centic Date: Sat Dec 31 16:53:16 2016 New Revision: 1776796 URL: http://svn.apache.org/viewvc?rev=1776796&view=rev Log: Bug 60219: FormulaParser can't parse external references when sheet name is quoted Modified: poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java poi/trunk/src/ooxml/testcases/org/apache/poi/ss/formula/TestFormulaParser.java poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java poi/trunk/src/testcases/org/apache/poi/hssf/model/TestWorkbook.java poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java Modified: poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java?rev=1776796&r1=1776795&r2=1776796&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java (original) +++ poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java Sat Dec 31 16:53:16 2016 @@ -115,7 +115,7 @@ public final class FormulaParser { * Tracks whether the run of whitespace preceding "look" could be an * intersection operator. See GetChar. */ - private boolean _inIntersection = false; + private boolean _inIntersection; private final FormulaParsingWorkbook _book; private final SpreadsheetVersion _ssVersion; @@ -133,7 +133,7 @@ public final class FormulaParser { * This class is recommended only for single threaded use. * * If you have a {@link org.apache.poi.hssf.usermodel.HSSFWorkbook}, and not a - * {@link org.apache.poi.hssf.model.Workbook}, then use the convenience method on + * {@link org.apache.poi.ss.usermodel.Workbook}, then use the convenience method on * {@link org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator} */ private FormulaParser(String formula, FormulaParsingWorkbook book, int sheetIndex, int rowIndex) { @@ -298,7 +298,7 @@ public final class FormulaParser { /** Get a Number */ private String GetNum() { - StringBuffer value = new StringBuffer(); + StringBuilder value = new StringBuilder(); while (IsDigit(this.look)){ value.append(this.look); @@ -670,7 +670,7 @@ public final class FormulaParser { GetChar(); } // parse column quantifier - String startColumnName = null; + String startColumnName; String endColumnName = null; int nColQuantifiers = 0; int savePtr1 = _pointer; @@ -1112,13 +1112,20 @@ public final class FormulaParser { @Override public String toString() { - StringBuilder sb = new StringBuilder(64); - sb.append(getClass().getName()).append(" ["); - sb.append(_rep); - sb.append("]"); - return sb.toString(); + return getClass().getName() + " [" + _rep + "]"; } } + + private String getBookName() { + StringBuilder sb = new StringBuilder(); + GetChar(); + while (look != ']') { + sb.append(look); + GetChar(); + } + GetChar(); + return sb.toString(); + } /** * Note - caller should reset {@link #_pointer} upon null result @@ -1127,22 +1134,18 @@ public final class FormulaParser { private SheetIdentifier parseSheetName() { String bookName; if (look == '[') { - StringBuilder sb = new StringBuilder(); - GetChar(); - while (look != ']') { - sb.append(look); - GetChar(); - } - GetChar(); - bookName = sb.toString(); + bookName = getBookName(); } else { bookName = null; } if (look == '\'') { - StringBuffer sb = new StringBuffer(); - Match('\''); + + if (look == '[') + bookName = getBookName(); + + StringBuilder sb = new StringBuilder(); boolean done = look == '\''; while(!done) { sb.append(look); @@ -1232,7 +1235,7 @@ public final class FormulaParser { boolean result = CellReference.classifyCellReference(str, _ssVersion) == NameType.CELL; if(result){ - /** + /* * Check if the argument is a function. Certain names can be either a cell reference or a function name * depending on the contenxt. Compare the following examples in Excel 2007: * (a) LOG10(100) + 1 @@ -1323,7 +1326,7 @@ public final class FormulaParser { * Adds a name (named range or user defined function) to underlying workbook's names table * @param functionName */ - private final void addName(String functionName) { + private void addName(String functionName) { final Name name = _book.createName(); name.setFunction(true); name.setNameName(functionName); @@ -1766,7 +1769,7 @@ public final class FormulaParser { * return Int or Number Ptg based on size of input */ private static Ptg getNumberPtgFromString(String number1, String number2, String exponent) { - StringBuffer number = new StringBuffer(); + StringBuilder number = new StringBuilder(); if (number2 == null) { number.append(number1); @@ -1808,7 +1811,7 @@ public final class FormulaParser { private String parseStringLiteral() { Match('"'); - StringBuffer token = new StringBuffer(); + StringBuilder token = new StringBuilder(); while (true) { if (look == '"') { GetChar(); @@ -1975,7 +1978,7 @@ public final class FormulaParser { //{--------------------------------------------------------------} //{ Parse and Translate an Assignment Statement } - /** + /* procedure Assignment; var Name: string[8]; begin Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/ss/formula/TestFormulaParser.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/ss/formula/TestFormulaParser.java?rev=1776796&r1=1776795&r2=1776796&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/ss/formula/TestFormulaParser.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/ss/formula/TestFormulaParser.java Sat Dec 31 16:53:16 2016 @@ -33,7 +33,6 @@ import org.apache.poi.ss.formula.ptg.Str import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.junit.Ignore; import org.junit.Test; /** @@ -189,7 +188,6 @@ public class TestFormulaParser { } // bug 60219: FormulaParser can't parse external references when sheet name is quoted - @Ignore @Test public void testParseExternalReferencesWithQuotedSheetName() throws Exception { XSSFWorkbook wb = new XSSFWorkbook(); Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java?rev=1776796&r1=1776795&r2=1776796&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java (original) +++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java Sat Dec 31 16:53:16 2016 @@ -218,7 +218,7 @@ public final class TestFormulaParser { } } - private final static void assertEqualsIgnoreCase(String expected, String actual) { + private static void assertEqualsIgnoreCase(String expected, String actual) { assertEquals(expected.toLowerCase(Locale.ROOT), actual.toLowerCase(Locale.ROOT)); } @@ -414,7 +414,7 @@ public final class TestFormulaParser { HSSFSheet sheet = wb.createSheet("Test"); HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); - String formula = null; + String formula; cell.setCellFormula("1.3E21/3"); formula = cell.getCellFormula(); @@ -488,7 +488,7 @@ public final class TestFormulaParser { HSSFSheet sheet = wb.createSheet("Test"); HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); - String formula = null; + String formula; // starts from decimal point @@ -530,7 +530,7 @@ public final class TestFormulaParser { HSSFSheet sheet = wb.createSheet("Test"); HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); - String formula = null; + String formula; cell.setCellFormula("A1.A2"); formula = cell.getCellFormula(); @@ -557,7 +557,7 @@ public final class TestFormulaParser { HSSFSheet sheet = wb.createSheet("Test"); HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); - String formula = null; + String formula; // References to a single cell: @@ -718,8 +718,8 @@ public final class TestFormulaParser { assertEquals(65534.6, np.getValue(), 0); } + @Test public void testMissingArgs() { - confirmTokenClasses("if(A1, ,C1)", RefPtg.class, AttrPtg.class, // tAttrIf @@ -1327,8 +1327,7 @@ public final class TestFormulaParser { } /** - * TODO - delete equiv test: - * {@link BaseTestBugzillaIssues#test42448()} + * See the related/similar test: {@link BaseTestBugzillaIssues#bug42448()} */ @Test public void testParseAbnormalSheetNamesAndRanges_bug42448() throws IOException { @@ -1373,11 +1372,10 @@ public final class TestFormulaParser { @Test public void testUnionOfFullCollFullRowRef() throws IOException { - Ptg[] ptgs; - ptgs = parseFormula("3:4"); - ptgs = parseFormula("$Z:$AC"); + parseFormula("3:4"); + Ptg[] ptgs = parseFormula("$Z:$AC"); confirmTokenClasses(ptgs, AreaPtg.class); - ptgs = parseFormula("B:B"); + parseFormula("B:B"); ptgs = parseFormula("$11:$13"); confirmTokenClasses(ptgs, AreaPtg.class); Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestWorkbook.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestWorkbook.java?rev=1776796&r1=1776795&r2=1776796&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestWorkbook.java (original) +++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestWorkbook.java Sat Dec 31 16:53:16 2016 @@ -115,7 +115,7 @@ public final class TestWorkbook { } }; - /** + /* * register the two test UDFs in a UDF finder, to be passed to the evaluator */ UDFFinder udff1 = new DefaultUDFFinder(new String[] { "myFunc", }, Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java?rev=1776796&r1=1776795&r2=1776796&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java (original) +++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java Sat Dec 31 16:53:16 2016 @@ -1836,17 +1836,26 @@ public final class TestBugs extends Base assertEquals("'[$http://gagravarr.org/FormulaRefs.xls]Sheet1'!B1", row.getCell(1).getCellFormula()); assertEquals(112.0, row.getCell(1).getNumericCellValue(), 0); + // Link our new workbook + Workbook externalWb1 = new HSSFWorkbook(); + externalWb1.createSheet("Sheet1"); + wb1.linkExternalWorkbook("$http://gagravarr.org/FormulaRefs2.xls", externalWb1); + // Change 4 row.getCell(1).setCellFormula("'[$http://gagravarr.org/FormulaRefs2.xls]Sheet1'!B2"); row.getCell(1).setCellValue(123.0); + // Link our new workbook + Workbook externalWb2 = new HSSFWorkbook(); + externalWb2.createSheet("Sheet1"); + wb1.linkExternalWorkbook("$http://example.com/FormulaRefs.xls", externalWb2); + // Add 5 row = s.createRow(5); row.createCell(1, CellType.FORMULA); row.getCell(1).setCellFormula("'[$http://example.com/FormulaRefs.xls]Sheet1'!B1"); row.getCell(1).setCellValue(234.0); - // Re-test HSSFWorkbook wb2 = writeOutAndReadBack(wb1); wb1.close(); @@ -1871,8 +1880,7 @@ public final class TestBugs extends Base assertEquals("[Formulas2.xls]Sheet1!B2", row.getCell(1).getCellFormula()); assertEquals(112.0, row.getCell(1).getNumericCellValue(), 0); - // TODO - Fix these so they work... - /*row = s.getRow(4); + row = s.getRow(4); assertEquals(CellType.FORMULA, row.getCell(1).getCellTypeEnum()); assertEquals("'[$http://gagravarr.org/FormulaRefs2.xls]Sheet1'!B2", row.getCell(1).getCellFormula()); assertEquals(123.0, row.getCell(1).getNumericCellValue(), 0); @@ -1880,7 +1888,7 @@ public final class TestBugs extends Base row = s.getRow(5); assertEquals(CellType.FORMULA, row.getCell(1).getCellTypeEnum()); assertEquals("'[$http://example.com/FormulaRefs.xls]Sheet1'!B1", row.getCell(1).getCellFormula()); - assertEquals(234.0, row.getCell(1).getNumericCellValue(), 0);*/ + assertEquals(234.0, row.getCell(1).getNumericCellValue(), 0); wb2.close(); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org For additional commands, e-mail: commits-help@poi.apache.org