Author: fanningpj
Date: Tue May  6 20:29:55 2025
New Revision: 1925442

URL: http://svn.apache.org/viewvc?rev=1925442&view=rev
Log:
allow ATP function override

Modified:
    
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java

Modified: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java?rev=1925442&r1=1925441&r2=1925442&view=diff
==============================================================================
--- 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java 
(original)
+++ 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java 
Tue May  6 20:29:55 2025
@@ -17,6 +17,8 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.TreeSet;
 
+import org.apache.logging.log4j.Logger;
+import org.apache.poi.logging.PoiLogManager;
 import org.apache.poi.ss.formula.OperationEvaluationContext;
 import org.apache.poi.ss.formula.eval.NotImplementedFunctionException;
 import org.apache.poi.ss.formula.eval.ValueEval;
@@ -32,6 +34,8 @@ public final class AnalysisToolPak imple
 
     public static final UDFFinder instance = new AnalysisToolPak();
 
+    private static final Logger LOG = 
PoiLogManager.getLogger(AnalysisToolPak.class);
+
     private static final class NotImplemented implements FreeRefFunction {
         private final String _functionName;
 
@@ -264,11 +268,28 @@ public final class AnalysisToolPak imple
      * @param name  the function name
      * @param func  the function to register
      * @throws IllegalArgumentException if the function is unknown or already 
registered.
-     * @since 3.8 beta6
+     * @since since 3.8 beta6
      */
     public static void registerFunction(String name, FreeRefFunction func) {
+        registerFunction(name, func, false);
+    }
+
+    /**
+     * Register an ATP function in runtime.
+     *
+     * @param name  the function name
+     * @param func  the function to register
+     * @param force force registration even if the function is already 
registered or unknown to POI
+     * @throws IllegalArgumentException if the function is unknown or already 
registered (and `force` is not true).
+     * @since POI 5.4.2
+     */
+    public static void registerFunction(String name, FreeRefFunction func, 
boolean force) {
         AnalysisToolPak inst = (AnalysisToolPak)instance;
-        if(!isATPFunction(name)) {
+        if (force) {
+            // Excel regularly adds new functions, so the ones registered in 
POI
+            // can be well out of date - allow users who know what they are 
doing
+            // to force their update
+        } else if(!isATPFunction(name)) {
             FunctionMetadata metaData = 
FunctionMetadataRegistry.getFunctionByName(name);
             if(metaData != null) {
                 throw new IllegalArgumentException(name + " is a built-in 
Excel function. " +
@@ -277,13 +298,20 @@ public final class AnalysisToolPak imple
 
             throw new IllegalArgumentException(name + " is not a function from 
the Excel Analysis Toolpack.");
         }
+
         FreeRefFunction f = inst.findFunction(name);
         if(f != null && !(f instanceof NotImplemented)) {
-            throw new IllegalArgumentException("POI already implements " + 
name +
-                    ". You cannot override POI's implementations of Excel 
functions");
+            if (force) {
+                LOG.info("POI already implements " + name +
+                        ". You are overriding the implementation.");
+            } else {
+                throw new IllegalArgumentException("POI already implements " + 
name +
+                        ". You cannot override POI's implementations of Excel 
functions");
+            }
         }
 
         // FIXME: inconsistent case-sensitivity
         inst._functionsByName.put(name, func);
     }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to