diff --git a/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java b/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java index c80280bcf1..1352b716cd 100644 --- a/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java +++ b/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java @@ -35,36 +35,36 @@ import org.apache.poi.util.Internal; @Internal public final class CollaboratingWorkbooksEnvironment { - public static final class WorkbookNotFoundException extends Exception { + public static final class WorkbookNotFoundException extends Exception { private static final long serialVersionUID = 8787784539811167941L; WorkbookNotFoundException(String msg) { - super(msg); - } - } + super(msg); + } + } - public static final CollaboratingWorkbooksEnvironment EMPTY = new CollaboratingWorkbooksEnvironment(); + public static final CollaboratingWorkbooksEnvironment EMPTY = new CollaboratingWorkbooksEnvironment(); - private final Map _evaluatorsByName; - private final WorkbookEvaluator[] _evaluators; + private final Map _evaluatorsByName; + private final WorkbookEvaluator[] _evaluators; - private boolean _unhooked; - private CollaboratingWorkbooksEnvironment() { - _evaluatorsByName = Collections.emptyMap(); - _evaluators = new WorkbookEvaluator[0]; - } - - public static void setup(String[] workbookNames, WorkbookEvaluator[] evaluators) { - int nItems = workbookNames.length; - if (evaluators.length != nItems) { - throw new IllegalArgumentException("Number of workbook names is " + nItems - + " but number of evaluators is " + evaluators.length); - } - if (nItems < 1) { - throw new IllegalArgumentException("Must provide at least one collaborating worbook"); - } - new CollaboratingWorkbooksEnvironment(workbookNames, evaluators, nItems); - } + private boolean _unhooked; + private CollaboratingWorkbooksEnvironment() { + _evaluatorsByName = Collections.emptyMap(); + _evaluators = new WorkbookEvaluator[0]; + } + + public static void setup(String[] workbookNames, WorkbookEvaluator[] evaluators) { + int nItems = workbookNames.length; + if (evaluators.length != nItems) { + throw new IllegalArgumentException("Number of workbook names is " + nItems + + " but number of evaluators is " + evaluators.length); + } + if (nItems < 1) { + throw new IllegalArgumentException("Must provide at least one collaborating worbook"); + } + 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"); @@ -74,28 +74,28 @@ public final class CollaboratingWorkbooksEnvironment { new CollaboratingWorkbooksEnvironment(evaluatorsByName, evaluators); } - private CollaboratingWorkbooksEnvironment(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) { - 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 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 + "'"; + String msg = "Attempted to register same workbook under names '" + + uniqueEvals.get(wbEval) + "' and '" + wbName + "'"; throw new IllegalArgumentException(msg); } uniqueEvals.put(wbEval, wbName); @@ -107,79 +107,78 @@ public final class CollaboratingWorkbooksEnvironment { _evaluatorsByName = evaluatorsByName; } - private static void hookNewEnvironment(WorkbookEvaluator[] evaluators, CollaboratingWorkbooksEnvironment env) { + private static void hookNewEnvironment(WorkbookEvaluator[] evaluators, CollaboratingWorkbooksEnvironment env) { + // All evaluators will need to share the same cache. + // but the cache takes an optional evaluation listener. + int nItems = evaluators.length; + IEvaluationListener evalListener = evaluators[0].getEvaluationListener(); + // make sure that all evaluators have the same listener + for(int i=0; i oldEnvs = new HashSet(); + for(int i=0; i oldEnvs = new HashSet(); - for(int i=0; i i = _evaluatorsByName.keySet().iterator(); - int count=0; - while(i.hasNext()) { - if (count++>0) { - sb.append(", "); - } - sb.append("'").append(i.next()).append("'"); - } - sb.append(")"); - } - throw new WorkbookNotFoundException(sb.toString()); - } - return result; - } + public WorkbookEvaluator getWorkbookEvaluator(String workbookName) throws WorkbookNotFoundException { + if (_unhooked) { + throw new IllegalStateException("This environment has been unhooked"); + } + WorkbookEvaluator result = _evaluatorsByName.get(workbookName); + if (result == null) { + StringBuffer sb = new StringBuffer(256); + sb.append("Could not resolve external workbook name '").append(workbookName).append("'."); + if (_evaluators.length < 1) { + sb.append(" Workbook environment has not been set up."); + } else { + sb.append(" The following workbook names are valid: ("); + Iterator i = _evaluatorsByName.keySet().iterator(); + int count=0; + while(i.hasNext()) { + if (count++>0) { + sb.append(", "); + } + sb.append("'").append(i.next()).append("'"); + } + sb.append(")"); + } + throw new WorkbookNotFoundException(sb.toString()); + } + return result; + } }