@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);
- }
- }
-
- public static final CollaboratingWorkbooksEnvironment EMPTY = new CollaboratingWorkbooksEnvironment();
-
- private final Map<String, WorkbookEvaluator> _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);
- }
+ super(msg);
+ }
+ }
+
+ public static final CollaboratingWorkbooksEnvironment EMPTY = new CollaboratingWorkbooksEnvironment();
+
+ private final Map<String, WorkbookEvaluator> _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);
+ }
public static void setup(Map<String,WorkbookEvaluator> evaluatorsByName) {
if (evaluatorsByName.size() < 1) {
throw new IllegalArgumentException("Must provide at least one collaborating worbook");
new CollaboratingWorkbooksEnvironment(evaluatorsByName, evaluators);
}
- private CollaboratingWorkbooksEnvironment(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) {
- this(toUniqueMap(workbookNames, evaluators, nItems), evaluators);
- }
- private static Map<String, WorkbookEvaluator> toUniqueMap(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) {
- Map<String, WorkbookEvaluator> evaluatorsByName = new HashMap<String, WorkbookEvaluator>(nItems * 3 / 2);
- for(int i=0; i<nItems; i++) {
- String wbName = workbookNames[i];
- WorkbookEvaluator wbEval = evaluators[i];
- if (evaluatorsByName.containsKey(wbName)) {
- throw new IllegalArgumentException("Duplicate workbook name '" + wbName + "'");
- }
- evaluatorsByName.put(wbName, wbEval);
- }
- return evaluatorsByName;
- }
+ private CollaboratingWorkbooksEnvironment(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) {
+ this(toUniqueMap(workbookNames, evaluators, nItems), evaluators);
+ }
+ private static Map<String, WorkbookEvaluator> toUniqueMap(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) {
+ Map<String, WorkbookEvaluator> evaluatorsByName = new HashMap<String, WorkbookEvaluator>(nItems * 3 / 2);
+ for(int i=0; i<nItems; i++) {
+ String wbName = workbookNames[i];
+ WorkbookEvaluator wbEval = evaluators[i];
+ if (evaluatorsByName.containsKey(wbName)) {
+ throw new IllegalArgumentException("Duplicate workbook name '" + wbName + "'");
+ }
+ evaluatorsByName.put(wbName, wbEval);
+ }
+ return evaluatorsByName;
+ }
private CollaboratingWorkbooksEnvironment(Map<String, WorkbookEvaluator> evaluatorsByName, WorkbookEvaluator[] evaluators) {
IdentityHashMap<WorkbookEvaluator, String> uniqueEvals = new IdentityHashMap<WorkbookEvaluator, String>(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);
_evaluatorsByName = evaluatorsByName;
}
- 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<nItems; i++) {
- if(evalListener != evaluators[i].getEvaluationListener()) {
- // This would be very complex to support
- throw new RuntimeException("Workbook evaluators must all have the same evaluation listener");
- }
- }
- EvaluationCache cache = new EvaluationCache(evalListener);
-
- for(int i=0; i<nItems; i++) {
- evaluators[i].attachToEnvironment(env, cache, i);
- }
- }
-
- /**
- * Completely dismantles all workbook environments that the supplied evaluators are part of
- */
- private void unhookOldEnvironments(WorkbookEvaluator[] evaluators) {
- Set<CollaboratingWorkbooksEnvironment> oldEnvs = new HashSet<CollaboratingWorkbooksEnvironment>();
- for(int i=0; i<evaluators.length; i++) {
- oldEnvs.add(evaluators[i].getEnvironment());
- }
- CollaboratingWorkbooksEnvironment[] oldCWEs = new CollaboratingWorkbooksEnvironment[oldEnvs.size()];
- oldEnvs.toArray(oldCWEs);
- for (int i = 0; i < oldCWEs.length; i++) {
- oldCWEs[i].unhook();
- }
- }
-
- /**
- * Tell all contained evaluators that this environment should be discarded
- */
- private void unhook() {
- if (_evaluators.length < 1) {
- // Never dismantle the EMPTY environment
- return;
- }
- for (int i = 0; i < _evaluators.length; i++) {
- _evaluators[i].detachFromEnvironment();
- }
- _unhooked = true;
- }
-
- 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<String> 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;
- }
+ 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<nItems; i++) {
+ if(evalListener != evaluators[i].getEvaluationListener()) {
+ // This would be very complex to support
+ throw new RuntimeException("Workbook evaluators must all have the same evaluation listener");
+ }
+ }
+ EvaluationCache cache = new EvaluationCache(evalListener);
+
+ for(int i=0; i<nItems; i++) {
+ evaluators[i].attachToEnvironment(env, cache, i);
+ }
+ }
+
+ /**
+ * Completely dismantles all workbook environments that the supplied evaluators are part of
+ */
+ private void unhookOldEnvironments(WorkbookEvaluator[] evaluators) {
+ Set<CollaboratingWorkbooksEnvironment> oldEnvs = new HashSet<CollaboratingWorkbooksEnvironment>();
+ for(int i=0; i<evaluators.length; i++) {
+ oldEnvs.add(evaluators[i].getEnvironment());
+ }
+ CollaboratingWorkbooksEnvironment[] oldCWEs = new CollaboratingWorkbooksEnvironment[oldEnvs.size()];
+ oldEnvs.toArray(oldCWEs);
+ for (int i = 0; i < oldCWEs.length; i++) {
+ oldCWEs[i].unhook();
+ }
+ }
+
+ /**
+ * Tell all contained evaluators that this environment should be discarded
+ */
+ private void unhook() {
+ if (_evaluators.length < 1) {
+ // Never dismantle the EMPTY environment
+ return;
+ }
+ for (int i = 0; i < _evaluators.length; i++) {
+ _evaluators[i].detachFromEnvironment();
+ }
+ _unhooked = true;
+ }
+
+ 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<String> 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;
+ }
}