fixed generics compiler warnings for poi.ss.formula
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@723021 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ed2b70b976
commit
d289d148b3
@ -18,7 +18,6 @@
|
|||||||
package org.apache.poi.hssf.record.formula.eval;
|
package org.apache.poi.hssf.record.formula.eval;
|
||||||
|
|
||||||
import org.apache.poi.hssf.record.formula.ConcatPtg;
|
import org.apache.poi.hssf.record.formula.ConcatPtg;
|
||||||
import org.apache.poi.hssf.record.formula.Ptg;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
|
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
|
||||||
@ -28,8 +27,8 @@ public final class ConcatEval implements OperationEval {
|
|||||||
|
|
||||||
private ConcatPtg delegate;
|
private ConcatPtg delegate;
|
||||||
|
|
||||||
public ConcatEval(Ptg ptg) {
|
public ConcatEval(ConcatPtg ptg) {
|
||||||
this.delegate = (ConcatPtg) ptg;
|
delegate = ptg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Eval evaluate(Eval[] args, int srcRow, short srcCol) {
|
public Eval evaluate(Eval[] args, int srcRow, short srcCol) {
|
||||||
@ -46,7 +45,7 @@ public final class ConcatEval implements OperationEval {
|
|||||||
sb.append(sve.getStringValue());
|
sb.append(sve.getStringValue());
|
||||||
} else if (ve == BlankEval.INSTANCE) {
|
} else if (ve == BlankEval.INSTANCE) {
|
||||||
// do nothing
|
// do nothing
|
||||||
} else { // must be an error eval
|
} else {
|
||||||
throw new RuntimeException("Unexpected value type ("
|
throw new RuntimeException("Unexpected value type ("
|
||||||
+ ve.getClass().getName() + ")");
|
+ ve.getClass().getName() + ")");
|
||||||
}
|
}
|
||||||
|
@ -1,49 +1,43 @@
|
|||||||
/*
|
/* ====================================================================
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
* this work for additional information regarding copyright ownership.
|
this work for additional information regarding copyright ownership.
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
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 not use this file except in compliance with
|
||||||
* the License. You may obtain a copy of the License at
|
the License. You may obtain a copy of the License at
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
limitations under the License.
|
||||||
*/
|
==================================================================== */
|
||||||
/*
|
|
||||||
* Created on May 8, 2005
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.apache.poi.hssf.record.formula.eval;
|
package org.apache.poi.hssf.record.formula.eval;
|
||||||
|
|
||||||
import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
|
import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
|
||||||
import org.apache.poi.hssf.record.formula.Ptg;
|
|
||||||
import org.apache.poi.hssf.record.formula.functions.Function;
|
import org.apache.poi.hssf.record.formula.functions.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
|
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class FuncVarEval extends FunctionEval {
|
public final class FuncVarEval extends FunctionEval {
|
||||||
|
|
||||||
private AbstractFunctionPtg delegate;
|
private AbstractFunctionPtg delegate;
|
||||||
|
|
||||||
public FuncVarEval(Ptg funcPtg) {
|
public FuncVarEval(AbstractFunctionPtg funcPtg) {
|
||||||
delegate = (AbstractFunctionPtg) funcPtg;
|
delegate = funcPtg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
|
public Eval evaluate(Eval[] operands, int srcRow, short srcCol) {
|
||||||
Eval retval = null;
|
|
||||||
Function f = getFunction();
|
Function f = getFunction();
|
||||||
if (f != null)
|
if (f == null) {
|
||||||
retval = f.evaluate(operands, srcRow, srcCol);
|
return ErrorEval.FUNCTION_NOT_IMPLEMENTED;
|
||||||
else
|
}
|
||||||
retval = ErrorEval.FUNCTION_NOT_IMPLEMENTED;
|
return f.evaluate(operands, srcRow, srcCol);
|
||||||
return retval;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNumberOfOperands() {
|
public int getNumberOfOperands() {
|
||||||
|
@ -28,12 +28,12 @@ import org.apache.poi.hssf.record.formula.eval.ValueEval;
|
|||||||
final class CellEvaluationFrame {
|
final class CellEvaluationFrame {
|
||||||
|
|
||||||
private final FormulaCellCacheEntry _cce;
|
private final FormulaCellCacheEntry _cce;
|
||||||
private final Set _sensitiveInputCells;
|
private final Set<CellCacheEntry> _sensitiveInputCells;
|
||||||
private FormulaUsedBlankCellSet _usedBlankCellGroup;
|
private FormulaUsedBlankCellSet _usedBlankCellGroup;
|
||||||
|
|
||||||
public CellEvaluationFrame(FormulaCellCacheEntry cce) {
|
public CellEvaluationFrame(FormulaCellCacheEntry cce) {
|
||||||
_cce = cce;
|
_cce = cce;
|
||||||
_sensitiveInputCells = new HashSet();
|
_sensitiveInputCells = new HashSet<CellCacheEntry>();
|
||||||
}
|
}
|
||||||
public CellCacheEntry getCCE() {
|
public CellCacheEntry getCCE() {
|
||||||
return _cce;
|
return _cce;
|
||||||
|
@ -37,12 +37,12 @@ public final class CollaboratingWorkbooksEnvironment {
|
|||||||
|
|
||||||
public static final CollaboratingWorkbooksEnvironment EMPTY = new CollaboratingWorkbooksEnvironment();
|
public static final CollaboratingWorkbooksEnvironment EMPTY = new CollaboratingWorkbooksEnvironment();
|
||||||
|
|
||||||
private final Map _evaluatorsByName;
|
private final Map<String, WorkbookEvaluator> _evaluatorsByName;
|
||||||
private final WorkbookEvaluator[] _evaluators;
|
private final WorkbookEvaluator[] _evaluators;
|
||||||
|
|
||||||
private boolean _unhooked;
|
private boolean _unhooked;
|
||||||
private CollaboratingWorkbooksEnvironment() {
|
private CollaboratingWorkbooksEnvironment() {
|
||||||
_evaluatorsByName = Collections.EMPTY_MAP;
|
_evaluatorsByName = Collections.emptyMap();
|
||||||
_evaluators = new WorkbookEvaluator[0];
|
_evaluators = new WorkbookEvaluator[0];
|
||||||
}
|
}
|
||||||
public static void setup(String[] workbookNames, WorkbookEvaluator[] evaluators) {
|
public static void setup(String[] workbookNames, WorkbookEvaluator[] evaluators) {
|
||||||
@ -58,8 +58,8 @@ public final class CollaboratingWorkbooksEnvironment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private CollaboratingWorkbooksEnvironment(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) {
|
private CollaboratingWorkbooksEnvironment(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) {
|
||||||
Map m = new HashMap(nItems * 3 / 2);
|
Map<String, WorkbookEvaluator> m = new HashMap<String, WorkbookEvaluator>(nItems * 3 / 2);
|
||||||
IdentityHashMap uniqueEvals = new IdentityHashMap(nItems * 3 / 2);
|
IdentityHashMap<WorkbookEvaluator, String> uniqueEvals = new IdentityHashMap<WorkbookEvaluator, String>(nItems * 3 / 2);
|
||||||
for(int i=0; i<nItems; i++) {
|
for(int i=0; i<nItems; i++) {
|
||||||
String wbName = workbookNames[i];
|
String wbName = workbookNames[i];
|
||||||
WorkbookEvaluator wbEval = evaluators[i];
|
WorkbookEvaluator wbEval = evaluators[i];
|
||||||
@ -102,7 +102,7 @@ public final class CollaboratingWorkbooksEnvironment {
|
|||||||
|
|
||||||
}
|
}
|
||||||
private void unhookOldEnvironments(WorkbookEvaluator[] evaluators) {
|
private void unhookOldEnvironments(WorkbookEvaluator[] evaluators) {
|
||||||
Set oldEnvs = new HashSet();
|
Set<CollaboratingWorkbooksEnvironment> oldEnvs = new HashSet<CollaboratingWorkbooksEnvironment>();
|
||||||
for(int i=0; i<evaluators.length; i++) {
|
for(int i=0; i<evaluators.length; i++) {
|
||||||
oldEnvs.add(evaluators[i].getEnvironment());
|
oldEnvs.add(evaluators[i].getEnvironment());
|
||||||
}
|
}
|
||||||
@ -130,7 +130,7 @@ public final class CollaboratingWorkbooksEnvironment {
|
|||||||
if (_unhooked) {
|
if (_unhooked) {
|
||||||
throw new IllegalStateException("This environment has been unhooked");
|
throw new IllegalStateException("This environment has been unhooked");
|
||||||
}
|
}
|
||||||
WorkbookEvaluator result = (WorkbookEvaluator) _evaluatorsByName.get(workbookName);
|
WorkbookEvaluator result = _evaluatorsByName.get(workbookName);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
StringBuffer sb = new StringBuffer(256);
|
StringBuffer sb = new StringBuffer(256);
|
||||||
sb.append("Could not resolve external workbook name '").append(workbookName).append("'.");
|
sb.append("Could not resolve external workbook name '").append(workbookName).append("'.");
|
||||||
@ -138,7 +138,7 @@ public final class CollaboratingWorkbooksEnvironment {
|
|||||||
sb.append(" Workbook environment has not been set up.");
|
sb.append(" Workbook environment has not been set up.");
|
||||||
} else {
|
} else {
|
||||||
sb.append(" The following workbook names are valid: (");
|
sb.append(" The following workbook names are valid: (");
|
||||||
Iterator i = _evaluatorsByName.keySet().iterator();
|
Iterator<String> i = _evaluatorsByName.keySet().iterator();
|
||||||
int count=0;
|
int count=0;
|
||||||
while(i.hasNext()) {
|
while(i.hasNext()) {
|
||||||
if (count++>0) {
|
if (count++>0) {
|
||||||
|
@ -37,14 +37,14 @@ import org.apache.poi.hssf.usermodel.HSSFCell;
|
|||||||
*/
|
*/
|
||||||
final class EvaluationTracker {
|
final class EvaluationTracker {
|
||||||
// TODO - consider deleting this class and letting CellEvaluationFrame take care of itself
|
// TODO - consider deleting this class and letting CellEvaluationFrame take care of itself
|
||||||
private final List _evaluationFrames;
|
private final List<CellEvaluationFrame> _evaluationFrames;
|
||||||
private final Set _currentlyEvaluatingCells;
|
private final Set<FormulaCellCacheEntry> _currentlyEvaluatingCells;
|
||||||
private final EvaluationCache _cache;
|
private final EvaluationCache _cache;
|
||||||
|
|
||||||
public EvaluationTracker(EvaluationCache cache) {
|
public EvaluationTracker(EvaluationCache cache) {
|
||||||
_cache = cache;
|
_cache = cache;
|
||||||
_evaluationFrames = new ArrayList();
|
_evaluationFrames = new ArrayList<CellEvaluationFrame>();
|
||||||
_currentlyEvaluatingCells = new HashSet();
|
_currentlyEvaluatingCells = new HashSet<FormulaCellCacheEntry>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -79,7 +79,7 @@ final class EvaluationTracker {
|
|||||||
if (nFrames < 1) {
|
if (nFrames < 1) {
|
||||||
throw new IllegalStateException("Call to endEvaluate without matching call to startEvaluate");
|
throw new IllegalStateException("Call to endEvaluate without matching call to startEvaluate");
|
||||||
}
|
}
|
||||||
CellEvaluationFrame frame = (CellEvaluationFrame) _evaluationFrames.get(nFrames-1);
|
CellEvaluationFrame frame = _evaluationFrames.get(nFrames-1);
|
||||||
|
|
||||||
frame.updateFormulaResult(result);
|
frame.updateFormulaResult(result);
|
||||||
}
|
}
|
||||||
@ -102,7 +102,7 @@ final class EvaluationTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nFrames--;
|
nFrames--;
|
||||||
CellEvaluationFrame frame = (CellEvaluationFrame) _evaluationFrames.get(nFrames);
|
CellEvaluationFrame frame = _evaluationFrames.get(nFrames);
|
||||||
if (cce != frame.getCCE()) {
|
if (cce != frame.getCCE()) {
|
||||||
throw new IllegalStateException("Wrong cell specified. ");
|
throw new IllegalStateException("Wrong cell specified. ");
|
||||||
}
|
}
|
||||||
@ -117,7 +117,7 @@ final class EvaluationTracker {
|
|||||||
if (prevFrameIndex < 0) {
|
if (prevFrameIndex < 0) {
|
||||||
// Top level frame, there is no 'cell' above this frame that is using the current cell
|
// Top level frame, there is no 'cell' above this frame that is using the current cell
|
||||||
} else {
|
} else {
|
||||||
CellEvaluationFrame consumingFrame = (CellEvaluationFrame) _evaluationFrames.get(prevFrameIndex);
|
CellEvaluationFrame consumingFrame = _evaluationFrames.get(prevFrameIndex);
|
||||||
consumingFrame.addSensitiveInputCell(cce);
|
consumingFrame.addSensitiveInputCell(cce);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,7 +129,7 @@ final class EvaluationTracker {
|
|||||||
if (prevFrameIndex < 0) {
|
if (prevFrameIndex < 0) {
|
||||||
// Top level frame, there is no 'cell' above this frame that is using the current cell
|
// Top level frame, there is no 'cell' above this frame that is using the current cell
|
||||||
} else {
|
} else {
|
||||||
CellEvaluationFrame consumingFrame = (CellEvaluationFrame) _evaluationFrames.get(prevFrameIndex);
|
CellEvaluationFrame consumingFrame = _evaluationFrames.get(prevFrameIndex);
|
||||||
if (value == BlankEval.INSTANCE) {
|
if (value == BlankEval.INSTANCE) {
|
||||||
consumingFrame.addUsedBlankCell(bookIndex, sheetIndex, rowIndex, columnIndex);
|
consumingFrame.addUsedBlankCell(bookIndex, sheetIndex, rowIndex, columnIndex);
|
||||||
} else {
|
} else {
|
||||||
|
@ -87,11 +87,11 @@ final class FormulaCellCacheEntry extends CellCacheEntry {
|
|||||||
if (nPrevUsed < 1) {
|
if (nPrevUsed < 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Set usedSet;
|
Set<CellCacheEntry> usedSet;
|
||||||
if (nUsed < 1) {
|
if (nUsed < 1) {
|
||||||
usedSet = Collections.EMPTY_SET;
|
usedSet = Collections.emptySet();
|
||||||
} else {
|
} else {
|
||||||
usedSet = new HashSet(nUsed * 3 / 2);
|
usedSet = new HashSet<CellCacheEntry>(nUsed * 3 / 2);
|
||||||
for (int i = 0; i < nUsed; i++) {
|
for (int i = 0; i < nUsed; i++) {
|
||||||
usedSet.add(usedCells[i]);
|
usedSet.add(usedCells[i]);
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ public class FormulaRenderer {
|
|||||||
if (ptgs == null || ptgs.length == 0) {
|
if (ptgs == null || ptgs.length == 0) {
|
||||||
throw new IllegalArgumentException("ptgs must not be null");
|
throw new IllegalArgumentException("ptgs must not be null");
|
||||||
}
|
}
|
||||||
Stack stack = new Stack();
|
Stack<String> stack = new Stack<String>();
|
||||||
|
|
||||||
for (int i=0 ; i < ptgs.length; i++) {
|
for (int i=0 ; i < ptgs.length; i++) {
|
||||||
Ptg ptg = ptgs[i];
|
Ptg ptg = ptgs[i];
|
||||||
@ -59,7 +59,7 @@ public class FormulaRenderer {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (ptg instanceof ParenthesisPtg) {
|
if (ptg instanceof ParenthesisPtg) {
|
||||||
String contents = (String)stack.pop();
|
String contents = stack.pop();
|
||||||
stack.push ("(" + contents + ")");
|
stack.push ("(" + contents + ")");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -106,7 +106,7 @@ public class FormulaRenderer {
|
|||||||
// stack.push(). So this is either an internal error or impossible.
|
// stack.push(). So this is either an internal error or impossible.
|
||||||
throw new IllegalStateException("Stack underflow");
|
throw new IllegalStateException("Stack underflow");
|
||||||
}
|
}
|
||||||
String result = (String) stack.pop();
|
String result = stack.pop();
|
||||||
if(!stack.isEmpty()) {
|
if(!stack.isEmpty()) {
|
||||||
// Might be caused by some tokens like AttrPtg and Mem*Ptg, which really shouldn't
|
// Might be caused by some tokens like AttrPtg and Mem*Ptg, which really shouldn't
|
||||||
// put anything on the stack
|
// put anything on the stack
|
||||||
|
@ -49,14 +49,14 @@ final class FormulaUsedBlankCellSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final class BlankCellSheetGroup {
|
private static final class BlankCellSheetGroup {
|
||||||
private final List _rectangleGroups;
|
private final List<BlankCellRectangleGroup> _rectangleGroups;
|
||||||
private int _currentRowIndex;
|
private int _currentRowIndex;
|
||||||
private int _firstColumnIndex;
|
private int _firstColumnIndex;
|
||||||
private int _lastColumnIndex;
|
private int _lastColumnIndex;
|
||||||
private BlankCellRectangleGroup _currentRectangleGroup;
|
private BlankCellRectangleGroup _currentRectangleGroup;
|
||||||
|
|
||||||
public BlankCellSheetGroup() {
|
public BlankCellSheetGroup() {
|
||||||
_rectangleGroups = new ArrayList();
|
_rectangleGroups = new ArrayList<BlankCellRectangleGroup>();
|
||||||
_currentRowIndex = -1;
|
_currentRowIndex = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ final class FormulaUsedBlankCellSet {
|
|||||||
|
|
||||||
public boolean containsCell(int rowIndex, int columnIndex) {
|
public boolean containsCell(int rowIndex, int columnIndex) {
|
||||||
for (int i=_rectangleGroups.size()-1; i>=0; i--) {
|
for (int i=_rectangleGroups.size()-1; i>=0; i--) {
|
||||||
BlankCellRectangleGroup bcrg = (BlankCellRectangleGroup) _rectangleGroups.get(i);
|
BlankCellRectangleGroup bcrg = _rectangleGroups.get(i);
|
||||||
if (bcrg.containsCell(rowIndex, columnIndex)) {
|
if (bcrg.containsCell(rowIndex, columnIndex)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -157,10 +157,10 @@ final class FormulaUsedBlankCellSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Map _sheetGroupsByBookSheet;
|
private final Map<BookSheetKey, BlankCellSheetGroup> _sheetGroupsByBookSheet;
|
||||||
|
|
||||||
public FormulaUsedBlankCellSet() {
|
public FormulaUsedBlankCellSet() {
|
||||||
_sheetGroupsByBookSheet = new HashMap();
|
_sheetGroupsByBookSheet = new HashMap<BookSheetKey, BlankCellSheetGroup>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addCell(int bookIndex, int sheetIndex, int rowIndex, int columnIndex) {
|
public void addCell(int bookIndex, int sheetIndex, int rowIndex, int columnIndex) {
|
||||||
@ -171,7 +171,7 @@ final class FormulaUsedBlankCellSet {
|
|||||||
private BlankCellSheetGroup getSheetGroup(int bookIndex, int sheetIndex) {
|
private BlankCellSheetGroup getSheetGroup(int bookIndex, int sheetIndex) {
|
||||||
BookSheetKey key = new BookSheetKey(bookIndex, sheetIndex);
|
BookSheetKey key = new BookSheetKey(bookIndex, sheetIndex);
|
||||||
|
|
||||||
BlankCellSheetGroup result = (BlankCellSheetGroup) _sheetGroupsByBookSheet.get(key);
|
BlankCellSheetGroup result = _sheetGroupsByBookSheet.get(key);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
result = new BlankCellSheetGroup();
|
result = new BlankCellSheetGroup();
|
||||||
_sheetGroupsByBookSheet.put(key, result);
|
_sheetGroupsByBookSheet.put(key, result);
|
||||||
@ -180,7 +180,7 @@ final class FormulaUsedBlankCellSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsCell(BookSheetKey key, int rowIndex, int columnIndex) {
|
public boolean containsCell(BookSheetKey key, int rowIndex, int columnIndex) {
|
||||||
BlankCellSheetGroup bcsg = (BlankCellSheetGroup) _sheetGroupsByBookSheet.get(key);
|
BlankCellSheetGroup bcsg = _sheetGroupsByBookSheet.get(key);
|
||||||
if (bcsg == null) {
|
if (bcsg == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.formula;
|
package org.apache.poi.ss.formula;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -66,81 +63,39 @@ import org.apache.poi.hssf.record.formula.eval.UnaryPlusEval;
|
|||||||
/**
|
/**
|
||||||
* This class creates <tt>OperationEval</tt> instances to help evaluate <tt>OperationPtg</tt>
|
* This class creates <tt>OperationEval</tt> instances to help evaluate <tt>OperationPtg</tt>
|
||||||
* formula tokens.
|
* formula tokens.
|
||||||
*
|
*
|
||||||
* @author Josh Micich
|
* @author Josh Micich
|
||||||
*/
|
*/
|
||||||
final class OperationEvaluatorFactory {
|
final class OperationEvaluatorFactory {
|
||||||
private static final Class[] OPERATION_CONSTRUCTOR_CLASS_ARRAY = new Class[] { Ptg.class };
|
|
||||||
// TODO - use singleton instances directly instead of reflection
|
private static final Map<Class<? extends Ptg>, OperationEval> _instancesByPtgClass = initialiseInstancesMap();
|
||||||
private static final Map _constructorsByPtgClass = initialiseConstructorsMap();
|
|
||||||
private static final Map _instancesByPtgClass = initialiseInstancesMap();
|
|
||||||
|
|
||||||
private OperationEvaluatorFactory() {
|
private OperationEvaluatorFactory() {
|
||||||
// no instances of this class
|
// no instances of this class
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map initialiseConstructorsMap() {
|
private static Map<Class<? extends Ptg>, OperationEval> initialiseInstancesMap() {
|
||||||
Map m = new HashMap(32);
|
Map<Class<? extends Ptg>, OperationEval> m = new HashMap<Class<? extends Ptg>, OperationEval>(32);
|
||||||
add(m, ConcatPtg.class, ConcatEval.class);
|
m.put(EqualPtg.class, EqualEval.instance);
|
||||||
add(m, FuncPtg.class, FuncVarEval.class);
|
|
||||||
add(m, FuncVarPtg.class, FuncVarEval.class);
|
m.put(EqualPtg.class, EqualEval.instance);
|
||||||
|
m.put(GreaterEqualPtg.class, GreaterEqualEval.instance);
|
||||||
|
m.put(GreaterThanPtg.class, GreaterThanEval.instance);
|
||||||
|
m.put(LessEqualPtg.class, LessEqualEval.instance);
|
||||||
|
m.put(LessThanPtg.class, LessThanEval.instance);
|
||||||
|
m.put(NotEqualPtg.class, NotEqualEval.instance);
|
||||||
|
|
||||||
|
m.put(AddPtg.class, AddEval.instance);
|
||||||
|
m.put(DividePtg.class, DivideEval.instance);
|
||||||
|
m.put(MultiplyPtg.class, MultiplyEval.instance);
|
||||||
|
m.put(PercentPtg.class, PercentEval.instance);
|
||||||
|
m.put(PowerPtg.class, PowerEval.instance);
|
||||||
|
m.put(SubtractPtg.class, SubtractEval.instance);
|
||||||
|
m.put(UnaryMinusPtg.class, UnaryMinusEval.instance);
|
||||||
|
m.put(UnaryPlusPtg.class, UnaryPlusEval.instance);
|
||||||
|
m.put(RangePtg.class, RangeEval.instance);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
private static Map initialiseInstancesMap() {
|
|
||||||
Map m = new HashMap(32);
|
|
||||||
add(m, EqualPtg.class, EqualEval.instance);
|
|
||||||
add(m, GreaterEqualPtg.class, GreaterEqualEval.instance);
|
|
||||||
add(m, GreaterThanPtg.class, GreaterThanEval.instance);
|
|
||||||
add(m, LessEqualPtg.class, LessEqualEval.instance);
|
|
||||||
add(m, LessThanPtg.class, LessThanEval.instance);
|
|
||||||
add(m, NotEqualPtg.class, NotEqualEval.instance);
|
|
||||||
|
|
||||||
add(m, AddPtg.class, AddEval.instance);
|
|
||||||
add(m, DividePtg.class, DivideEval.instance);
|
|
||||||
add(m, MultiplyPtg.class, MultiplyEval.instance);
|
|
||||||
add(m, PercentPtg.class, PercentEval.instance);
|
|
||||||
add(m, PowerPtg.class, PowerEval.instance);
|
|
||||||
add(m, SubtractPtg.class, SubtractEval.instance);
|
|
||||||
add(m, UnaryMinusPtg.class, UnaryMinusEval.instance);
|
|
||||||
add(m, UnaryPlusPtg.class, UnaryPlusEval.instance);
|
|
||||||
add(m, RangePtg.class, RangeEval.instance);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void add(Map m, Class ptgClass, OperationEval evalInstance) {
|
|
||||||
if(!Ptg.class.isAssignableFrom(ptgClass)) {
|
|
||||||
throw new IllegalArgumentException("Expected Ptg subclass");
|
|
||||||
}
|
|
||||||
m.put(ptgClass, evalInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void add(Map m, Class ptgClass, Class evalClass) {
|
|
||||||
// perform some validation now, to keep later exception handlers simple
|
|
||||||
if(!Ptg.class.isAssignableFrom(ptgClass)) {
|
|
||||||
throw new IllegalArgumentException("Expected Ptg subclass");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!OperationEval.class.isAssignableFrom(evalClass)) {
|
|
||||||
throw new IllegalArgumentException("Expected OperationEval subclass");
|
|
||||||
}
|
|
||||||
if (!Modifier.isPublic(evalClass.getModifiers())) {
|
|
||||||
throw new RuntimeException("Eval class must be public");
|
|
||||||
}
|
|
||||||
if (Modifier.isAbstract(evalClass.getModifiers())) {
|
|
||||||
throw new RuntimeException("Eval class must not be abstract");
|
|
||||||
}
|
|
||||||
|
|
||||||
Constructor constructor;
|
|
||||||
try {
|
|
||||||
constructor = evalClass.getDeclaredConstructor(OPERATION_CONSTRUCTOR_CLASS_ARRAY);
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
throw new RuntimeException("Missing constructor");
|
|
||||||
}
|
|
||||||
if (!Modifier.isPublic(constructor.getModifiers())) {
|
|
||||||
throw new RuntimeException("Eval constructor must be public");
|
|
||||||
}
|
|
||||||
m.put(ptgClass, constructor);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns the OperationEval concrete impl instance corresponding
|
* returns the OperationEval concrete impl instance corresponding
|
||||||
@ -150,38 +105,29 @@ final class OperationEvaluatorFactory {
|
|||||||
if(ptg == null) {
|
if(ptg == null) {
|
||||||
throw new IllegalArgumentException("ptg must not be null");
|
throw new IllegalArgumentException("ptg must not be null");
|
||||||
}
|
}
|
||||||
Object result;
|
OperationEval result;
|
||||||
|
|
||||||
Class ptgClass = ptg.getClass();
|
Class ptgClass = ptg.getClass();
|
||||||
|
|
||||||
result = _instancesByPtgClass.get(ptgClass);
|
result = _instancesByPtgClass.get(ptgClass);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
return (OperationEval) result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ptgClass == FuncPtg.class) {
|
||||||
Constructor constructor = (Constructor) _constructorsByPtgClass.get(ptgClass);
|
return new FuncVarEval((FuncPtg)ptg);
|
||||||
if(constructor == null) {
|
|
||||||
if(ptgClass == ExpPtg.class) {
|
|
||||||
// ExpPtg is used for array formulas and shared formulas.
|
|
||||||
// it is currently unsupported, and may not even get implemented here
|
|
||||||
throw new RuntimeException("ExpPtg currently not supported");
|
|
||||||
}
|
|
||||||
throw new RuntimeException("Unexpected operation ptg class (" + ptgClass.getName() + ")");
|
|
||||||
}
|
}
|
||||||
|
if (ptgClass == FuncVarPtg.class) {
|
||||||
Object[] initargs = { ptg };
|
return new FuncVarEval((FuncVarPtg)ptg);
|
||||||
try {
|
|
||||||
result = constructor.newInstance(initargs);
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (InstantiationException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
return (OperationEval) result;
|
if (ptgClass == ConcatPtg.class) {
|
||||||
|
return new ConcatEval((ConcatPtg)ptg);
|
||||||
|
}
|
||||||
|
if(ptgClass == ExpPtg.class) {
|
||||||
|
// ExpPtg is used for array formulas and shared formulas.
|
||||||
|
// it is currently unsupported, and may not even get implemented here
|
||||||
|
throw new RuntimeException("ExpPtg currently not supported");
|
||||||
|
}
|
||||||
|
throw new RuntimeException("Unexpected operation ptg class (" + ptgClass.getName() + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,10 +64,10 @@ final class PlainCellCache {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map _plainValueEntriesByLoc;
|
private Map<Loc, PlainValueCellCacheEntry> _plainValueEntriesByLoc;
|
||||||
|
|
||||||
public PlainCellCache() {
|
public PlainCellCache() {
|
||||||
_plainValueEntriesByLoc = new HashMap();
|
_plainValueEntriesByLoc = new HashMap<Loc, PlainValueCellCacheEntry>();
|
||||||
}
|
}
|
||||||
public void put(Loc key, PlainValueCellCacheEntry cce) {
|
public void put(Loc key, PlainValueCellCacheEntry cce) {
|
||||||
_plainValueEntriesByLoc.put(key, cce);
|
_plainValueEntriesByLoc.put(key, cce);
|
||||||
@ -76,7 +76,7 @@ final class PlainCellCache {
|
|||||||
_plainValueEntriesByLoc.clear();
|
_plainValueEntriesByLoc.clear();
|
||||||
}
|
}
|
||||||
public PlainValueCellCacheEntry get(Loc key) {
|
public PlainValueCellCacheEntry get(Loc key) {
|
||||||
return (PlainValueCellCacheEntry) _plainValueEntriesByLoc.get(key);
|
return _plainValueEntriesByLoc.get(key);
|
||||||
}
|
}
|
||||||
public void remove(Loc key) {
|
public void remove(Loc key) {
|
||||||
_plainValueEntriesByLoc.remove(key);
|
_plainValueEntriesByLoc.remove(key);
|
||||||
|
Loading…
Reference in New Issue
Block a user