From ebc3e0d0a791d2caf60ea8d736d70e9ba7b3385c Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 21 Jul 2014 09:44:21 +0000 Subject: [PATCH] Allow creating a CollaboratingWorkbooksEnvironment from a Map too, not only a pair of arrays git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1612218 13f79535-47bb-0310-9956-ffa450edef68 --- .../CollaboratingWorkbooksEnvironment.java | 62 ++++++++++++------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java b/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java index 21d3fd0c6d..c80280bcf1 100644 --- a/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java +++ b/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java @@ -24,19 +24,21 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import org.apache.poi.util.Internal; /** - * Manages a collection of {@link WorkbookEvaluator}s, in order to support evaluation of formulas - * across spreadsheets.

+ * Manages a collection of {@link WorkbookEvaluator}s, in order to support + * evaluation of formulas across spreadsheets. * - * For POI internal use only - * - * @author Josh Micich + *

For POI internal use only - use

*/ +@Internal public final class CollaboratingWorkbooksEnvironment { public static final class WorkbookNotFoundException extends Exception { - WorkbookNotFoundException(String msg) { + private static final long serialVersionUID = 8787784539811167941L; + + WorkbookNotFoundException(String msg) { super(msg); } } @@ -51,6 +53,7 @@ public final class CollaboratingWorkbooksEnvironment { _evaluatorsByName = Collections.emptyMap(); _evaluators = new WorkbookEvaluator[0]; } + public static void setup(String[] workbookNames, WorkbookEvaluator[] evaluators) { int nItems = workbookNames.length; if (evaluators.length != nItems) { @@ -62,30 +65,47 @@ public final class CollaboratingWorkbooksEnvironment { } new CollaboratingWorkbooksEnvironment(workbookNames, evaluators, nItems); } + public static void setup(Map evaluatorsByName) { + if (evaluatorsByName.size() < 1) { + throw new IllegalArgumentException("Must provide at least one collaborating worbook"); + } + WorkbookEvaluator[] evaluators = + evaluatorsByName.values().toArray(new WorkbookEvaluator[evaluatorsByName.size()]); + new CollaboratingWorkbooksEnvironment(evaluatorsByName, evaluators); + } private CollaboratingWorkbooksEnvironment(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) { - Map m = new HashMap(nItems * 3 / 2); - IdentityHashMap uniqueEvals = new IdentityHashMap(nItems * 3 / 2); + this(toUniqueMap(workbookNames, evaluators, nItems), evaluators); + } + private static Map toUniqueMap(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) { + Map evaluatorsByName = new HashMap(nItems * 3 / 2); for(int i=0; i evaluatorsByName, WorkbookEvaluator[] evaluators) { + IdentityHashMap uniqueEvals = new IdentityHashMap(evaluators.length); + for (String wbName : evaluatorsByName.keySet()) { + WorkbookEvaluator wbEval = evaluatorsByName.get(wbName); + if (uniqueEvals.containsKey(wbEval)) { + String msg = "Attempted to register same workbook under names '" + + uniqueEvals.get(wbEval) + "' and '" + wbName + "'"; + throw new IllegalArgumentException(msg); + } + uniqueEvals.put(wbEval, wbName); + } + unhookOldEnvironments(evaluators); + hookNewEnvironment(evaluators, this); + _unhooked = false; + _evaluators = evaluators; + _evaluatorsByName = evaluatorsByName; + } private static void hookNewEnvironment(WorkbookEvaluator[] evaluators, CollaboratingWorkbooksEnvironment env) { -- 2.39.5