private String extractHeaderName(final BeanField<T> beanField) { if (beanField == null || beanField.getField() == null || beanField.getField().getDeclaredAnnotationsByType(CsvBindByName.class).length == 0) { return StringUtils.EMPTY; } final CsvBindByName bindByNameAnnotation = beanField.getField() .getDeclaredAnnotationsByType(CsvBindByName.class)[0]; return bindByNameAnnotation.column(); } }
@CsvBindByName(column = "Category") @CsvBindByPosition(position = 0) private final String name; @CsvBindByName(column = "FAILED") @CsvBindByPosition(position = 1) private final long failed; @CsvBindByName(column = "BROKEN") @CsvBindByPosition(position = 2) private final long broken; @CsvBindByName(column = "PASSED") @CsvBindByPosition(position = 3) private final long passed; @CsvBindByName(column = "SKIPPED") @CsvBindByPosition(position = 4) private final long skipped; @CsvBindByName(column = "UNKNOWN") @CsvBindByPosition(position = 5) private final long unknown;
@Override public void aggregate(final Configuration configuration, final List<LaunchResults> launchesResults, final Path outputDirectory) throws IOException { final Path dataFolder = Files.createDirectories(outputDirectory.resolve(Constants.DATA_DIR)); final Path csv = dataFolder.resolve(fileName); try (Writer writer = Files.newBufferedWriter(csv)) { final StatefulBeanToCsvBuilder<T> builder = new StatefulBeanToCsvBuilder<>(writer); final CustomMappingStrategy<T> mappingStrategy = new CustomMappingStrategy<>(); mappingStrategy.setType(type); final StatefulBeanToCsv<T> beanWriter = builder.withMappingStrategy(mappingStrategy).build(); try { beanWriter.write(getData(launchesResults)); } catch (Exception e) { throw new IOException(e); } } }
@Override public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException { super.setColumnMapping(new String[FieldUtils.getAllFields(bean.getClass()).length]); final int numColumns = findMaxFieldIndex(); if (!isAnnotationDriven() || numColumns == -1) { return super.generateHeader(bean); } String[] header = new String[numColumns + 1]; BeanField<T> beanField; for (int i = 0; i <= numColumns; i++) { beanField = findField(i); String columnHeaderName = extractHeaderName(beanField); header[i] = columnHeaderName; } return header; }
@Override public void setErrorLocale(Locale errorLocale) { this.errorLocale = ObjectUtils.defaultIfNull(errorLocale, Locale.getDefault()); // It's very possible that setType() was called first, which creates all // of the BeanFields, so we need to go back through the list and correct // them all. if(getFieldMap() != null) { getFieldMap().setErrorLocale(this.errorLocale); for(BeanField<T> f : getFieldMap().values()) { f.setErrorLocale(this.errorLocale); } } }
/** * The iterator returned by this method takes one line of input at a time * and returns one bean at a time. * <p>The advantage to this method is saving memory. The cost is the loss of * parallel processing, reducing throughput.</p> * <p>The iterator respects all aspects of {@link CsvToBean}, including * filters and capturing exceptions.</p> * @return An iterator over the beans created from the input */ @Override public Iterator<T> iterator() { prepareToReadInput(); return new CsvToBeanIterator(); }
/** * Setter for the column mapping. * This mapping is for reading. Use of this method in conjunction with * writing is undefined. * * @param columnMapping Column names to be mapped. */ public void setColumnMapping(String... columnMapping) { if (columnMapping != null) { headerIndex.initializeHeaderIndex(columnMapping); } else { headerIndex.clear(); } columnsExplicitlySet = true; }
/** * Get the column name for a given column position. * * @param col Column position. * @return The column name or null if the position is larger than the * header array or there are no headers defined. */ public String getColumnName(int col) { // headerIndex is never null because it's final return headerIndex.getByPosition(col); }
@Override protected Object chooseMultivaluedFieldIndexFromHeaderIndex(int index) { String[] s = headerIndex.getHeaderIndex(); return index >= s.length ? null: s[index]; }
@Override public BeanField<T> findField(int col) { // If we have a mapping for changing the order of the columns on // writing, be sure to use it. if (columnIndexForWriting != null) { return col < columnIndexForWriting.length ? fieldMap.get(columnIndexForWriting[col]) : null; } return fieldMap.get(col); }
@Override public int findMaxFieldIndex() { return headerIndex.findMaxIndex(); }
@Override public Iterator<FieldMapByPositionEntry<T>> iterator() { return new PositionIterator(); }
/** * Initializes this mapping with the regular expression used to map header * names and the {@link BeanField} they should be mapped to. * * @param pattern A valid regular expression against which potential header * names are matched * @param field The {@link BeanField} this mapping maps to * @param errorLocale The locale for error messages */ public RegexToBeanField(final String pattern, final BeanField<T> field, final Locale errorLocale) { super(field, errorLocale); regex = OpencsvUtils.compilePattern(pattern, Pattern.CASE_INSENSITIVE, BeanFieldJoin.class, this.errorLocale); }
@Override public Iterator<T> iterator() { return iterator(this); }
private String extractHeaderName(final BeanField<T> beanField) { if (beanField == null || beanField.getField() == null || beanField.getField().getDeclaredAnnotationsByType(CsvBindByName.class).length == 0) { return StringUtils.EMPTY; } final CsvBindByName bindByNameAnnotation = beanField.getField() .getDeclaredAnnotationsByType(CsvBindByName.class)[0]; return bindByNameAnnotation.column(); } }
@CsvBindByName(column = "Epic") @CsvBindByPosition(position = 0) private final String epic; @CsvBindByName(column = "Feature") @CsvBindByPosition(position = 1) private final String feature; @CsvBindByName(column = "Story") @CsvBindByPosition(position = 2) private final String story; @CsvBindByName(column = "FAILED") @CsvBindByPosition(position = 3) private long failed; @CsvBindByName(column = "BROKEN") @CsvBindByPosition(position = 4) private long broken; @CsvBindByName(column = "PASSED") @CsvBindByPosition(position = 5) private long passed; @CsvBindByName(column = "SKIPPED") @CsvBindByPosition(position = 6) private long skipped; @CsvBindByName(column = "UNKNOWN")
/** * Gets a column name. * * @param col Position of the column. * @return Column name or null if col > number of mappings. */ @Override public String getColumnName(int col) { return headerIndex.getByPosition(col); }
/** * Retrieves the column mappings. * * @return String array with the column mappings. */ public String[] getColumnMapping() { return headerIndex.getHeaderIndex(); }
@CsvBindByName(column = "Status") @CsvBindByPosition(position = 0) private final String status; @CsvBindByName(column = "Start Time") @CsvBindByPosition(position = 1) private final String start; @CsvBindByName(column = "Stop Time") @CsvBindByPosition(position = 2) private final String stop; @CsvBindByName(column = "Duration in ms") @CsvBindByPosition(position = 3) private final String duration; @CsvBindByName(column = "Parent Suite") @CsvBindByPosition(position = 4) private final String parentSuite; @CsvBindByName(column = "Suite") @CsvBindByPosition(position = 5) private final String suite; @CsvBindByName(column = "Sub Suite") @CsvBindByPosition(position = 6) private final String subSuite; @CsvBindByName(column = "Test Class")
@Override public String findHeader(int col) { return headerIndex.getByPosition(col); }