| /* ==================================================================== |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ==================================================================== */ |
| |
| package org.apache.poi.ss.formula.eval; |
| |
| import junit.framework.TestCase; |
| |
| import org.apache.poi.hssf.HSSFTestDataSamples; |
| import org.apache.poi.ss.formula.functions.FreeRefFunction; |
| import org.apache.poi.ss.formula.udf.DefaultUDFFinder; |
| import org.apache.poi.ss.formula.udf.AggregatingUDFFinder; |
| import org.apache.poi.ss.formula.udf.UDFFinder; |
| import org.apache.poi.hssf.usermodel.HSSFCell; |
| import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; |
| import org.apache.poi.hssf.usermodel.HSSFRow; |
| import org.apache.poi.hssf.usermodel.HSSFSheet; |
| import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
| import org.apache.poi.ss.formula.OperationEvaluationContext; |
| |
| /** |
| * @author Josh Micich |
| * @author Petr Udalau - registering UDFs in workbook and using ToolPacks. |
| */ |
| public final class TestExternalFunction extends TestCase { |
| |
| private static class MyFunc implements FreeRefFunction { |
| public MyFunc() { |
| // |
| } |
| |
| @Override |
| public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { |
| if (args.length != 1 || !(args[0] instanceof StringEval)) { |
| return ErrorEval.VALUE_INVALID; |
| } |
| StringEval input = (StringEval) args[0]; |
| return new StringEval(input.getStringValue() + "abc"); |
| } |
| } |
| |
| private static class MyFunc2 implements FreeRefFunction { |
| public MyFunc2() { |
| // |
| } |
| |
| @Override |
| public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { |
| if (args.length != 1 || !(args[0] instanceof StringEval)) { |
| return ErrorEval.VALUE_INVALID; |
| } |
| StringEval input = (StringEval) args[0]; |
| return new StringEval(input.getStringValue() + "abc2"); |
| } |
| } |
| |
| /** |
| * Checks that an external function can get invoked from the formula |
| * evaluator. |
| */ |
| public void testInvoke() { |
| HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("testNames.xls"); |
| HSSFSheet sheet = wb.getSheetAt(0); |
| |
| /** |
| * register the two test UDFs in a UDF finder, to be passed to the evaluator |
| */ |
| UDFFinder udff1 = new DefaultUDFFinder(new String[] { "myFunc", }, |
| new FreeRefFunction[] { new MyFunc(), }); |
| UDFFinder udff2 = new DefaultUDFFinder(new String[] { "myFunc2", }, |
| new FreeRefFunction[] { new MyFunc2(), }); |
| UDFFinder udff = new AggregatingUDFFinder(udff1, udff2); |
| |
| |
| HSSFRow row = sheet.getRow(0); |
| HSSFCell myFuncCell = row.getCell(1); // =myFunc("_") |
| |
| HSSFCell myFunc2Cell = row.getCell(2); // =myFunc2("_") |
| |
| HSSFFormulaEvaluator fe = HSSFFormulaEvaluator.create(wb, null, udff); |
| assertEquals("_abc", fe.evaluate(myFuncCell).getStringValue()); |
| assertEquals("_abc2", fe.evaluate(myFunc2Cell).getStringValue()); |
| } |
| } |