pjfanning commented on code in PR #973:
URL: https://github.com/apache/poi/pull/973#discussion_r2634133213


##########
poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFDataSourcesFactory.java:
##########
@@ -37,541 +36,483 @@
  */
 @Beta
 public class XDDFDataSourcesFactory {
-
-    private XDDFDataSourcesFactory() {
-    }
-
-    public static XDDFCategoryDataSource fromDataSource(final CTAxDataSource 
categoryDS) {
-        if (categoryDS == null) {
-            return null;
-        }
-        if (categoryDS.getNumRef() != null && 
categoryDS.getNumRef().getNumCache() != null) {
-            return new XDDFCategoryDataSource() {
-                private final CTNumData category = (CTNumData) 
categoryDS.getNumRef().getNumCache().copy();
-                private final String formatCode = category.isSetFormatCode() ? 
category.getFormatCode() : null;
-
-                @Override
-                public boolean isCellRange() {
-                    return true;
-                }
-
-                @Override
-                public boolean isNumeric() {
-                    return true;
-                }
-
-                @Override
-                public String getDataRangeReference() {
-                    return categoryDS.getNumRef().getF();
-                }
-
-                @Override
-                public int getPointCount() {
-                    return (int) category.getPtCount().getVal();
-                }
-
-                @Override
-                public String getPointAt(int index) {
-                    if (category.sizeOfPtArray() <= index) {
-                        throw new IllegalArgumentException("Cannot access 
0-based index " + index +
-                                " in point-array with " + 
category.sizeOfPtArray() + " items");
-                    }
-                    return category.getPtArray(index).getV();
-                }
-
-                @Override
-                public String getFormatCode() { return formatCode; }
-            };
-        } else if (categoryDS.getStrRef() != null && 
categoryDS.getStrRef().getStrCache() != null) {
-            return new XDDFCategoryDataSource() {
-                private final CTStrData category = (CTStrData) 
categoryDS.getStrRef().getStrCache().copy();
-
-                @Override
-                public boolean isCellRange() {
-                    return true;
-                }
-
-                @Override
-                public String getDataRangeReference() {
-                    return categoryDS.getStrRef().getF();
-                }
-
-                @Override
-                public int getPointCount() {
-                    return (int) category.getPtCount().getVal();
-                }
-
-                @Override
-                public String getPointAt(int index) {
-                    return category.getPtArray(index).getV();
-                }
-
-                @Override
-                public String getFormatCode() { return null; }
-            };
-        } else if (categoryDS.getNumLit() != null) {
-            return new XDDFCategoryDataSource() {
-                private final CTNumData category = (CTNumData) 
categoryDS.getNumLit().copy();
-                private final String formatCode = category.isSetFormatCode() ? 
category.getFormatCode() : null;
-
-                @Override
-                public boolean isCellRange() {
-                    return false;
-                }
-
-                @Override
-                public boolean isLiteral() {
-                    return true;
-                }
-
-                @Override
-                public boolean isNumeric() {
-                    return true;
-                }
-
-                @Override
-                public boolean isReference() {
-                    return false;
-                }
-
-                @Override
-                public String getDataRangeReference() {
-                    return null;
-                }
-
-                @Override
-                public int getPointCount() {
-                    return (int) category.getPtCount().getVal();
-                }
-
-                @Override
-                public String getPointAt(int index) {
-                    return category.getPtArray(index).getV();
-                }
-
-                @Override
-                public String getFormatCode() { return formatCode; }
-            };
-        } else if (categoryDS.getStrLit() != null) {
-            return new XDDFCategoryDataSource() {
-                private final CTStrData category = (CTStrData) 
categoryDS.getStrLit().copy();
-
-                @Override
-                public boolean isCellRange() {
-                    return false;
-                }
-
-                @Override
-                public boolean isLiteral() {
-                    return true;
-                }
-
-                @Override
-                public boolean isReference() {
-                    return false;
-                }
-
-                @Override
-                public String getDataRangeReference() {
-                    return null;
-                }
-
-                @Override
-                public int getPointCount() {
-                    return (int) category.getPtCount().getVal();
-                }
-
-                @Override
-                public String getPointAt(int index) {
-                    return category.getPtArray(index).getV();
-                }
-
-                @Override
-                public String getFormatCode() { return null; }
-            };
-        } else {
-            return null; // in some weird cases the element is empty
-        }
-    }
-
-    public static XDDFNumericalDataSource<Double> fromDataSource(final 
CTNumDataSource valuesDS) {
-        if (valuesDS == null) {
-            return null;
-        }
-        if (valuesDS.getNumRef() != null && valuesDS.getNumRef().getNumCache() 
!= null) {
-            return new XDDFNumericalDataSource<Double>() {
-                private final CTNumData values = (CTNumData) 
valuesDS.getNumRef().getNumCache().copy();
-                private String formatCode = values.isSetFormatCode() ? 
values.getFormatCode() : null;
-
-                @Override
-                public String getFormatCode() {
-                    return formatCode;
-                }
-
-                @Override
-                public void setFormatCode(String formatCode) {
-                    this.formatCode = formatCode;
-                }
-
-                @Override
-                public boolean isCellRange() {
-                    return true;
-                }
-
-                @Override
-                public boolean isNumeric() {
-                    return true;
-                }
-
-                @Override
-                public boolean isReference() {
-                    return true;
-                }
-
-                @Override
-                public int getPointCount() {
-                    return (int) values.getPtCount().getVal();
-                }
-
-                @Override
-                public Double getPointAt(int index) {
-                    return Double.valueOf(values.getPtArray(index).getV());
-                }
-
-                @Override
-                public String getDataRangeReference() {
-                    return valuesDS.getNumRef().getF();
-                }
-
-                @Override
-                public int getColIndex() {
-                    return 0;
-                }
-            };
-        } else if (valuesDS.getNumLit() != null) {
-            return new XDDFNumericalDataSource<Double>() {
-                private final CTNumData values = (CTNumData) 
valuesDS.getNumLit().copy();
-                private String formatCode = values.isSetFormatCode() ? 
values.getFormatCode() : null;
-
-                @Override
-                public String getFormatCode() {
-                    return formatCode;
-                }
-
-                @Override
-                public void setFormatCode(String formatCode) {
-                    this.formatCode = formatCode;
-                }
-
-                @Override
-                public boolean isCellRange() {
-                    return false;
-                }
-
-                @Override
-                public boolean isLiteral() {
-                    return true;
-                }
-
-                @Override
-                public boolean isNumeric() {
-                    return true;
-                }
-
-                @Override
-                public boolean isReference() {
-                    return false;
-                }
-
-                @Override
-                public int getPointCount() {
-                    return (int) values.getPtCount().getVal();
-                }
-
-                @Override
-                public Double getPointAt(int index) {
-                    return Double.valueOf(values.getPtArray(index).getV());
-                }
-
-                @Override
-                public String getDataRangeReference() {
-                    return null;
-                }
-
-                @Override
-                public int getColIndex() {
-                    return 0;
-                }
-            };
-        } else {
-            return null; // in some weird cases the element is empty
-        }
-    }
-
-    public static <T extends Number> XDDFNumericalDataSource<T> fromArray(T[] 
elements) {
-        return new LiteralNumericalArrayDataSource<>(elements);
-    }
-
-    public static XDDFCategoryDataSource fromArray(String[] elements) {
-        return new LiteralStringArrayDataSource(elements);
-    }
-
-    public static <T extends Number> XDDFNumericalDataSource<T> fromArray(T[] 
elements, String dataRange) {
-        return new NumericalArrayDataSource<>(elements, dataRange);
-    }
-
-    public static XDDFCategoryDataSource fromArray(String[] elements, String 
dataRange) {
-        return new StringArrayDataSource(elements, dataRange);
-    }
-
-    public static <T extends Number> XDDFNumericalDataSource<T> fromArray(T[] 
elements, String dataRange, int col) {
-        return new NumericalArrayDataSource<>(elements, dataRange, col);
-    }
-
-    public static XDDFCategoryDataSource fromArray(String[] elements, String 
dataRange, int col) {
-        return new StringArrayDataSource(elements, dataRange, col);
-    }
-
-    public static XDDFNumericalDataSource<Double> 
fromNumericCellRange(XSSFSheet sheet,
-            CellRangeAddress cellRangeAddress) {
-        return new NumericalCellRangeDataSource(sheet, cellRangeAddress);
-    }
-
-    public static XDDFCategoryDataSource fromStringCellRange(XSSFSheet sheet, 
CellRangeAddress cellRangeAddress) {
-        return new StringCellRangeDataSource(sheet, cellRangeAddress);
-    }
-
-    private abstract static class AbstractArrayDataSource<T> implements 
XDDFDataSource<T> {
-        private final T[] elements;
-        private final String dataRange;
-        private int col = 0;
-
-        public AbstractArrayDataSource(T[] elements, String dataRange) {
-            this.elements = elements.clone();
-            this.dataRange = dataRange;
-        }
-
-        public AbstractArrayDataSource(T[] elements, String dataRange, int 
col) {
-            this.elements = elements.clone();
-            this.dataRange = dataRange;
-            this.col = col;
-        }
-
-        @Override
-        public int getPointCount() {
-            return elements.length;
-        }
-
-        @Override
-        public T getPointAt(int index) {
-            return elements[index];
-        }
-
-        @Override
-        public boolean isCellRange() {
-            return false;
-        }
-
-        @Override
-        public boolean isReference() {
-            return dataRange != null;
-        }
-
-        @Override
-        public boolean isNumeric() {
-            Class<?> arrayComponentType = 
elements.getClass().getComponentType();
-            return (Number.class.isAssignableFrom(arrayComponentType));
-        }
-
-        /**
-         * @return the dataRange
-         * @throws UnsupportedOperationException if there is no Data Range 
Reference
-         */
-        @Override
-        public String getDataRangeReference() {
-            if (dataRange == null) {
-                throw new UnsupportedOperationException("Literal data source 
can not be expressed by reference.");
-            } else {
-                return dataRange;
-            }
-        }
-
-        @Override
-        public int getColIndex() {
-            return col;
-        }
-    }
-
-    private static class NumericalArrayDataSource<T extends Number> extends 
AbstractArrayDataSource<T>
-            implements XDDFNumericalDataSource<T> {
-        private String formatCode;
-
-        public NumericalArrayDataSource(T[] elements, String dataRange) {
-            super(elements, dataRange);
-        }
-
-        public NumericalArrayDataSource(T[] elements, String dataRange, int 
col) {
-            super(elements, dataRange, col);
-        }
-
-        @Override
-        public String getFormatCode() {
-            return formatCode;
-        }
-
-        @Override
-        public void setFormatCode(String formatCode) {
-            this.formatCode = formatCode;
-        }
-    }
-
-    private static class StringArrayDataSource extends 
AbstractArrayDataSource<String>
-            implements XDDFCategoryDataSource {
-        public StringArrayDataSource(String[] elements, String dataRange) {
-            super(elements, dataRange);
-        }
-
-        public StringArrayDataSource(String[] elements, String dataRange, int 
col) {
-            super(elements, dataRange, col);
-        }
-
-        @Override
-        public String getFormatCode() { return null; }
-    }
-
-    private static class LiteralNumericalArrayDataSource<T extends Number> 
extends NumericalArrayDataSource<T> {
-        public LiteralNumericalArrayDataSource(T[] elements) {
-            super(elements, null, 0);
-        }
-
-        @Override
-        public boolean isLiteral() {
-            return true;
-        }
-    }
-
-    private static class LiteralStringArrayDataSource extends 
StringArrayDataSource {
-        public LiteralStringArrayDataSource(String[] elements) {
-            super(elements, null, 0);
-        }
-
-        @Override
-        public boolean isLiteral() {
-            return true;
-        }
-    }
-
-    private abstract static class AbstractCellRangeDataSource<T> implements 
XDDFDataSource<T> {
-        private final XSSFSheet sheet;
-        private final CellRangeAddress cellRangeAddress;
-        private final int numOfCells;
-        private final XSSFFormulaEvaluator evaluator;
-
-        protected AbstractCellRangeDataSource(XSSFSheet sheet, 
CellRangeAddress cellRangeAddress) {
-            this.sheet = sheet;
-            // Make copy since CellRangeAddress is mutable.
-            this.cellRangeAddress = cellRangeAddress.copy();
-            this.numOfCells = this.cellRangeAddress.getNumberOfCells();
-            this.evaluator = 
sheet.getWorkbook().getCreationHelper().createFormulaEvaluator();
-        }
-
-        @Override
-        public int getPointCount() {
-            return numOfCells;
-        }
-
-        @Override
-        public boolean isCellRange() {
-            return true;
-        }
-
-        @Override
-        public boolean isReference() {
-            return true;
-        }
-
-        @Override
-        public int getColIndex() {
-            return cellRangeAddress.getFirstColumn();
-        }
-
-        @Override
-        public String getDataRangeReference() {
-            return cellRangeAddress.formatAsString(sheet.getSheetName(), true);
-        }
-
-        protected CellValue getCellValueAt(int index) {
-            if (index < 0 || index >= numOfCells) {
-                throw new IndexOutOfBoundsException(
-                        "Index must be between 0 and " + (numOfCells - 1) + " 
(inclusive), given: " + index);
-            }
-            int firstRow = cellRangeAddress.getFirstRow();
-            int firstCol = cellRangeAddress.getFirstColumn();
-            int lastCol = cellRangeAddress.getLastColumn();
-            int width = lastCol - firstCol + 1;
-            int rowIndex = firstRow + index / width;
-            int cellIndex = firstCol + index % width;
-            XSSFRow row = sheet.getRow(rowIndex);
-            return (row == null) ? null : 
evaluator.evaluate(row.getCell(cellIndex));
-        }
-    }
-
-    private static class NumericalCellRangeDataSource extends 
AbstractCellRangeDataSource<Double>
-            implements XDDFNumericalDataSource<Double> {
-        protected NumericalCellRangeDataSource(XSSFSheet sheet, 
CellRangeAddress cellRangeAddress) {
-            super(sheet, cellRangeAddress);
-        }
-
-        private String formatCode;
-
-        @Override
-        public String getFormatCode() {
-            return formatCode;
-        }
-
-        @Override
-        public void setFormatCode(String formatCode) {
-            this.formatCode = formatCode;
-        }
-
-        @Override
-        public Double getPointAt(int index) {
-            CellValue cellValue = getCellValueAt(index);
-            if (cellValue != null && cellValue.getCellType() == 
CellType.NUMERIC) {
-                return cellValue.getNumberValue();
-            } else {
-                return null;
-            }
-        }
-
-        @Override
-        public boolean isNumeric() {
-            return true;
-        }
-    }
-
-    private static class StringCellRangeDataSource extends 
AbstractCellRangeDataSource<String>
-            implements XDDFCategoryDataSource {
-        protected StringCellRangeDataSource(XSSFSheet sheet, CellRangeAddress 
cellRangeAddress) {
-            super(sheet, cellRangeAddress);
-        }
-
-        @Override
-        public String getPointAt(int index) {
-            CellValue cellValue = getCellValueAt(index);
-            if (cellValue != null && cellValue.getCellType() == 
CellType.STRING) {
-                return cellValue.getStringValue();
-            } else {
-                return null;
-            }
-        }
-
-        @Override
-        public boolean isNumeric() {
-            return false;
-        }
-
-        @Override
-        public String getFormatCode() { return null; }
-    }
+       private XDDFDataSourcesFactory() {
+       }
+
+       public static XDDFCategoryDataSource fromDataSource(final 
CTAxDataSource categoryDS) {
+               if (categoryDS == null) {
+                       return null;
+               }
+               return new XDDFCategoryDataSourceImpl(categoryDS);
+
+       }
+
+       public static XDDFNumericalDataSource<Double> fromDataSource(final 
CTNumDataSource valuesDS) {
+               if (valuesDS == null) {
+                       return null;
+               }
+               if (valuesDS.getNumRef() != null && 
valuesDS.getNumRef().getNumCache() != null) {
+                       return new XDDFNumericalDataSource<Double>() {
+                               private final CTNumData values = (CTNumData) 
valuesDS.getNumRef().getNumCache().copy();
+                               private String formatCode = 
values.isSetFormatCode() ? values.getFormatCode() : null;
+
+                               @Override
+                               public String getFormatCode() {
+                                       return formatCode;
+                               }
+
+                               @Override
+                               public void setFormatCode(String formatCode) {
+                                       this.formatCode = formatCode;
+                               }
+
+                               @Override
+                               public boolean isCellRange() {
+                                       return true;
+                               }
+
+                               @Override
+                               public boolean isNumeric() {
+                                       return true;
+                               }
+
+                               @Override
+                               public boolean isReference() {
+                                       return true;
+                               }
+
+                               @Override
+                               public int getPointCount() {
+                                       return (int) 
values.getPtCount().getVal();
+                               }
+
+                               @Override
+                               public Double getPointAt(int index) {
+                                       return 
Double.valueOf(values.getPtArray(index).getV());
+                               }
+
+                               @Override
+                               public String getDataRangeReference() {
+                                       return valuesDS.getNumRef().getF();
+                               }
+
+                               @Override
+                               public int getColIndex() {
+                                       return 0;
+                               }
+                       };
+               } else if (valuesDS.getNumLit() != null) {
+                       return new XDDFNumericalDataSource<Double>() {
+                               private final CTNumData values = (CTNumData) 
valuesDS.getNumLit().copy();
+                               private String formatCode = 
values.isSetFormatCode() ? values.getFormatCode() : null;
+
+                               @Override
+                               public String getFormatCode() {
+                                       return formatCode;
+                               }
+
+                               @Override
+                               public void setFormatCode(String formatCode) {
+                                       this.formatCode = formatCode;
+                               }
+
+                               @Override
+                               public boolean isCellRange() {
+                                       return false;
+                               }
+
+                               @Override
+                               public boolean isLiteral() {
+                                       return true;
+                               }
+
+                               @Override
+                               public boolean isNumeric() {
+                                       return true;
+                               }
+
+                               @Override
+                               public boolean isReference() {
+                                       return false;
+                               }
+
+                               @Override
+                               public int getPointCount() {
+                                       return (int) 
values.getPtCount().getVal();
+                               }
+
+                               @Override
+                               public Double getPointAt(int index) {
+                                       return 
Double.valueOf(values.getPtArray(index).getV());
+                               }
+
+                               @Override
+                               public String getDataRangeReference() {
+                                       return null;
+                               }
+
+                               @Override
+                               public int getColIndex() {
+                                       return 0;
+                               }
+                       };
+               } else {
+                       return null; // in some weird cases the element is empty
+               }
+       }
+
+       public static <T extends Number> XDDFNumericalDataSource<T> 
fromArray(T[] elements) {
+               return new LiteralNumericalArrayDataSource<>(elements);
+       }
+
+       public static XDDFCategoryDataSource fromArray(String[] elements) {
+               return new LiteralStringArrayDataSource(elements);
+       }
+
+       public static <T extends Number> XDDFNumericalDataSource<T> 
fromArray(T[] elements, String dataRange) {
+               return new NumericalArrayDataSource<>(elements, dataRange);
+       }
+
+       public static XDDFCategoryDataSource fromArray(String[] elements, 
String dataRange) {
+               return new StringArrayDataSource(elements, dataRange);
+       }
+
+       public static <T extends Number> XDDFNumericalDataSource<T> 
fromArray(T[] elements, String dataRange, int col) {
+               return new NumericalArrayDataSource<>(elements, dataRange, col);
+       }
+
+       public static XDDFCategoryDataSource fromArray(String[] elements, 
String dataRange, int col) {
+               return new StringArrayDataSource(elements, dataRange, col);
+       }
+
+       public static XDDFNumericalDataSource<Double> 
fromNumericCellRange(XSSFSheet sheet, CellRangeAddress cellRangeAddress) {
+               return new NumericalCellRangeDataSource(sheet, 
cellRangeAddress);
+       }
+
+       public static XDDFCategoryDataSource fromStringCellRange(XSSFSheet 
sheet, CellRangeAddress cellRangeAddress) {
+               return new StringCellRangeDataSource(sheet, cellRangeAddress);
+       }
+
+       private abstract static class AbstractArrayDataSource<T> implements 
XDDFDataSource<T> {
+               private final T[] elements;
+               private final String dataRange;
+               private int col = 0;
+
+               public AbstractArrayDataSource(T[] elements, String dataRange) {
+                       this.elements = elements.clone();
+                       this.dataRange = dataRange;
+               }
+
+               public AbstractArrayDataSource(T[] elements, String dataRange, 
int col) {
+                       this.elements = elements.clone();
+                       this.dataRange = dataRange;
+                       this.col = col;
+               }
+
+               @Override
+               public int getPointCount() {
+                       return elements.length;
+               }
+
+               @Override
+               public T getPointAt(int index) {
+                       return elements[index];
+               }
+
+               @Override
+               public boolean isCellRange() {
+                       return false;
+               }
+
+               @Override
+               public boolean isReference() {
+                       return dataRange != null;
+               }
+
+               @Override
+               public boolean isNumeric() {
+                       Class<?> arrayComponentType = 
elements.getClass().getComponentType();
+                       return 
(Number.class.isAssignableFrom(arrayComponentType));
+               }
+
+               /**
+                * @return the dataRange
+                * @throws UnsupportedOperationException if there is no Data 
Range Reference
+                */
+               @Override
+               public String getDataRangeReference() {
+                       if (dataRange == null) {
+                               throw new 
UnsupportedOperationException("Literal data source can not be expressed by 
reference.");
+                       } else {
+                               return dataRange;
+                       }
+               }
+
+               @Override
+               public int getColIndex() {
+                       return col;
+               }
+       }
+
+       private static class NumericalArrayDataSource<T extends Number> extends 
AbstractArrayDataSource<T> implements XDDFNumericalDataSource<T> {
+               private String formatCode;
+
+               public NumericalArrayDataSource(T[] elements, String dataRange) 
{
+                       super(elements, dataRange);
+               }
+
+               public NumericalArrayDataSource(T[] elements, String dataRange, 
int col) {
+                       super(elements, dataRange, col);
+               }
+
+               @Override
+               public String getFormatCode() {
+                       return formatCode;
+               }
+
+               @Override
+               public void setFormatCode(String formatCode) {
+                       this.formatCode = formatCode;
+               }
+       }
+
+       private static class StringArrayDataSource extends 
AbstractArrayDataSource<String> implements XDDFCategoryDataSource {
+               public StringArrayDataSource(String[] elements, String 
dataRange) {
+                       super(elements, dataRange);
+               }
+
+               public StringArrayDataSource(String[] elements, String 
dataRange, int col) {
+                       super(elements, dataRange, col);
+               }
+
+               @Override
+               public String getFormatCode() {
+                       return null;
+               }
+       }
+
+       private static class LiteralNumericalArrayDataSource<T extends Number> 
extends NumericalArrayDataSource<T> {
+               public LiteralNumericalArrayDataSource(T[] elements) {
+                       super(elements, null, 0);
+               }
+
+               @Override
+               public boolean isLiteral() {
+                       return true;
+               }
+       }
+
+       private static class LiteralStringArrayDataSource extends 
StringArrayDataSource {
+               public LiteralStringArrayDataSource(String[] elements) {
+                       super(elements, null, 0);
+               }
+
+               @Override
+               public boolean isLiteral() {
+                       return true;
+               }
+       }
+
+       private abstract static class AbstractCellRangeDataSource<T> implements 
XDDFDataSource<T> {
+               private final XSSFSheet sheet;
+               private final CellRangeAddress cellRangeAddress;
+               private final int numOfCells;
+               private final XSSFFormulaEvaluator evaluator;
+
+               protected AbstractCellRangeDataSource(XSSFSheet sheet, 
CellRangeAddress cellRangeAddress) {
+                       this.sheet = sheet;
+                       // Make copy since CellRangeAddress is mutable.
+                       this.cellRangeAddress = cellRangeAddress.copy();
+                       this.numOfCells = 
this.cellRangeAddress.getNumberOfCells();
+                       this.evaluator = 
sheet.getWorkbook().getCreationHelper().createFormulaEvaluator();
+               }
+
+               @Override
+               public int getPointCount() {
+                       return numOfCells;
+               }
+
+               @Override
+               public boolean isCellRange() {
+                       return true;
+               }
+
+               @Override
+               public boolean isReference() {
+                       return true;
+               }
+
+               @Override
+               public int getColIndex() {
+                       return cellRangeAddress.getFirstColumn();
+               }
+
+               @Override
+               public String getDataRangeReference() {
+                       return 
cellRangeAddress.formatAsString(sheet.getSheetName(), true);
+               }
+
+               protected CellValue getCellValueAt(int index) {
+                       if (index < 0 || index >= numOfCells) {
+                               throw new IndexOutOfBoundsException("Index must 
be between 0 and " + (numOfCells - 1) + " (inclusive), given: " + index);
+                       }
+                       int firstRow = cellRangeAddress.getFirstRow();
+                       int firstCol = cellRangeAddress.getFirstColumn();
+                       int lastCol = cellRangeAddress.getLastColumn();
+                       int width = lastCol - firstCol + 1;
+                       int rowIndex = firstRow + index / width;
+                       int cellIndex = firstCol + index % width;
+                       XSSFRow row = sheet.getRow(rowIndex);
+                       return (row == null) ? null : 
evaluator.evaluate(row.getCell(cellIndex));
+               }
+       }
+
+       private static class NumericalCellRangeDataSource extends 
AbstractCellRangeDataSource<Double> implements XDDFNumericalDataSource<Double> {
+               protected NumericalCellRangeDataSource(XSSFSheet sheet, 
CellRangeAddress cellRangeAddress) {
+                       super(sheet, cellRangeAddress);
+               }
+
+               private String formatCode;
+
+               @Override
+               public String getFormatCode() {
+                       return formatCode;
+               }
+
+               @Override
+               public void setFormatCode(String formatCode) {
+                       this.formatCode = formatCode;
+               }
+
+               @Override
+               public Double getPointAt(int index) {
+                       CellValue cellValue = getCellValueAt(index);
+                       if (cellValue != null && cellValue.getCellType() == 
CellType.NUMERIC) {
+                               return cellValue.getNumberValue();
+                       } else {
+                               return null;
+                       }
+               }
+
+               @Override
+               public boolean isNumeric() {
+                       return true;
+               }
+       }
+
+       private static class StringCellRangeDataSource extends 
AbstractCellRangeDataSource<String> implements XDDFCategoryDataSource {
+               protected StringCellRangeDataSource(XSSFSheet sheet, 
CellRangeAddress cellRangeAddress) {
+                       super(sheet, cellRangeAddress);
+               }
+
+               @Override
+               public String getPointAt(int index) {
+                       CellValue cellValue = getCellValueAt(index);
+                       if (cellValue != null && cellValue.getCellType() == 
CellType.STRING) {
+                               return cellValue.getStringValue();
+                       } else {
+                               return null;
+                       }
+               }
+
+               @Override
+               public boolean isNumeric() {
+                       return false;
+               }
+
+               @Override
+               public String getFormatCode() {
+                       return null;
+               }
+       }
+
+       public static class XDDFCategoryDataSourceImpl implements 
XDDFCategoryDataSource {
+               CTAxDataSource categoryDS;
+               private final CTStrData categoryString;
+               private final CTNumData categoryNumber;
+               private final String formatCode;
+
+               enum Type {
+                       FROM_NUMBER_REFERENCE, FROM_STRING_REFERENCE, 
FROM_STRING_LITERAL, FROM_NUMBER_LITERAL, ERROR
+               }
+
+               public final Type type;
+
+               public XDDFCategoryDataSourceImpl(CTAxDataSource categoryDS) {
+                       this.categoryDS=categoryDS;
+                       if (categoryDS.getNumRef() != null && 
categoryDS.getNumRef().getNumCache() != null) {
+                               type = Type.FROM_NUMBER_REFERENCE;
+                               categoryNumber = (CTNumData) 
categoryDS.getNumRef().getNumCache().copy();
+                               categoryString = null;
+                       } else if (categoryDS.getStrRef() != null && 
categoryDS.getStrRef().getStrCache() != null) {
+                               type = Type.FROM_STRING_REFERENCE;
+                               categoryString = (CTStrData) 
categoryDS.getStrRef().getStrCache().copy();
+                               categoryNumber = null;
+                       } else if (categoryDS.getNumLit() != null) {
+                               type = Type.FROM_NUMBER_LITERAL;
+                               categoryNumber = (CTNumData) 
categoryDS.getNumLit().copy();
+                               categoryString = null;
+                       } else if (categoryDS.getStrLit() != null) {
+                               type = Type.FROM_STRING_LITERAL;
+                               this.categoryDS = categoryDS;
+                               categoryString = (CTStrData) 
categoryDS.getStrLit().copy();
+                               categoryNumber = null;
+                       } else {
+                               categoryNumber = null;
+                               categoryString = null;
+                               type = Type.ERROR; // in some weird cases the 
element is empty
+                       }
+                       if (type == Type.FROM_NUMBER_LITERAL || type == 
Type.FROM_NUMBER_REFERENCE)
+                               formatCode = categoryNumber.isSetFormatCode() ? 
categoryNumber.getFormatCode() : null;
+                       else
+                               formatCode = null;
+               }
+
+               @Override
+               public int getPointCount() {
+                       if (categoryString != null) {
+                               return (int) 
categoryString.getPtCount().getVal();
+                       }
+                       return (int) categoryNumber.getPtCount().getVal();
+               }
+
+               @Override
+               public String getPointAt(int index) {
+                       if (categoryString != null)
+                               return categoryString.getPtArray(index).getV();
+                       return categoryNumber.getPtArray(index).getV();
+               }
+
+               @Override
+               public boolean isCellRange() {
+                       return (type == Type.FROM_NUMBER_REFERENCE || type == 
Type.FROM_STRING_REFERENCE);
+               }
+
+               public boolean isReference() {
+                       return (type == Type.FROM_NUMBER_REFERENCE || type == 
Type.FROM_STRING_REFERENCE);
+               }
+               
+               public String getDataRangeReference() {
+                       switch (type) {
+                       case FROM_NUMBER_REFERENCE:
+                               return categoryDS.getNumRef().getF();
+                       case FROM_STRING_REFERENCE:
+                               return categoryDS.getStrRef().getF();
+                       }
+                       return null;
+               }
+
+               public String getFormatCode() {
+                       return formatCode;
+               }
+               
+           public boolean isNumeric() {
+              return (type == Type.FROM_NUMBER_REFERENCE || type == 
Type.FROM_NUMBER_LITERAL);

Review Comment:
   code will never be merged unless it is formatted correctly - 4 space indents 
and no tabs



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to