public String toCsv(Csv... records) { if (records != null && records.length > 0) { String[] header = records[0].getCsvHeader(); StringWriter writer = new StringWriter(); try (CSVPrinter printer = getCSVFormat().withHeader(header).print(writer)) { for (Csv record : records) { Object[] data = record.getCsvData(); if (data == null || data.length == 0) { log.debug("Skipping null or empty record"); continue; } for (Object column : data) { printer.print(objectToString(column)); } printer.println(); } } catch (IOException e) { log.error("Failed to generate CSV", e); } return writer.toString(); } return null; }
protected DefaultMapper(final Class<T> type, final CoercingConverter coercingConverter) { this.type = type; this.coercingConverter = coercingConverter; int higherIdx = -1; Class<?> current = type; while (current != Object.class) { for (final Field field : type.getDeclaredFields()) { final Csv csv = field.getAnnotation(Csv.class); if (csv != null) { final int pos = csv.index(); final String name = csv.name(); final boolean defaultName = Csv.DEFAULT_NAME.equals(name); // put each field a single time to avoid to set it twice even if position and name are // filled for header output if (pos >= 0) { if (fieldByPosition.put(pos, field) != null) { throw new IllegalArgumentException("multiple field for index " + pos + " in " + type); } if (!defaultName) { headers.put(pos, name); } } else if (!defaultName) { if (fieldByName.put(name, field) != null) { throw new IllegalArgumentException( "multiple field for name '" + name + "' in " + type); } } if (pos > higherIdx) { higherIdx = pos; } if (!field.isAccessible()) { field.setAccessible(true); } } } current = current.getSuperclass(); } maxIndex = higherIdx; }