Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,15 @@
<log4j.version>2.25.3</log4j.version>
<cxf.version>3.5.11</cxf.version>
<wss4j.version>2.4.3</wss4j.version>
<!--
We're using Apache POI for Excel file generation, so we're also forcibly upgrading
certain conflicting dependencies to the same or newer versions that POI uses.
-->
<poi.version>5.5.1</poi.version>
<commons-codec.version>1.21.0</commons-codec.version>
<commons-collections4.version>4.5.0</commons-collections4.version>
<commons-io.version>2.21.0</commons-io.version>
<commons-lang3.version>3.18.0</commons-lang3.version>
</properties>
<profiles>
<profile>
Expand Down Expand Up @@ -243,6 +252,10 @@
<excludes>
<exclude>WEB-INF/lib/log4j-*-2.*.jar</exclude>
<exclude>WEB-INF/lib/httpclient-4.5.5.jar</exclude>
<exclude>WEB-INF/lib/commons-codec-*.jar</exclude>
<exclude>WEB-INF/lib/commons-collections4-*.jar</exclude>
<exclude>WEB-INF/lib/commons-io-*.jar</exclude>
<exclude>WEB-INF/lib/commons-lang3-*.jar</exclude>
<exclude>WEB-INF/lib/commons-logging-*.jar</exclude>
<exclude>WEB-INF/lib/gson-*.jar</exclude>
<exclude>WEB-INF/lib/pw-iso20022-*.jar</exclude>
Expand Down Expand Up @@ -1786,6 +1799,55 @@
End of JAX-RS dependencies.
-->

<!--
Start of Apache POI dependencies (and forced upgrades of transitive dependencies).
-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>${commons-collections4.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!--
End of Apache POI dependencies.
-->

<dependency>
<groupId>com.prowidesoftware</groupId>
<artifactId>pw-iso20022</artifactId>
Expand Down
1 change: 1 addition & 0 deletions src/main/java/edu/cornell/kfs/sys/CUKFSConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ public static final class FileExtensions {
public static final String CSV = ".csv";
public static final String DONE = ".done";
public static final String DATA = ".data";
public static final String XLSX = ".xlsx";
}

public static final class OptionalModuleNamespaces {
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/edu/cornell/kfs/sys/CUKFSKeyConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,8 @@ public class CUKFSKeyConstants {
public static final String ERROR_BANK_REQUIRED_PER_PAYMENT_METHOD = "error.document.withBanking.bank.required";
public static final String ERROR_BANK_INVALID = "error.document.withBanking.bank.invalid";

public static final String MESSAGE_BATCH_UPLOAD_TITLE_CEMI_OUTPUT_DEFINITION = "message.batchUpload.title.cemiOutputDefinition";

// NOTE: The following set of constants can be removed if KualiCo adds variants that are more publicly visible.
public static final String ERROR_UPLOADFILE_EMPTY = "error.uploadFile.empty";
public static final String ERROR_DOCUMENT_INVALID_VALUE_ALLOWED_VALUES_PARAMETER =
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/edu/cornell/kfs/sys/CemiBaseConstants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package edu.cornell.kfs.sys;

public final class CemiBaseConstants {

public static final String CEMI_OUTPUT_DEFINITION_FILE_TYPE_IDENTIFIER = "cemiOutputDefinitionFileType";

public enum CemiFieldDefinitionType {
STATIC,
STRING;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package edu.cornell.kfs.sys.batch;

import edu.cornell.kfs.sys.CUKFSKeyConstants;
import edu.cornell.kfs.sys.CemiBaseConstants;
import edu.cornell.kfs.sys.batch.xml.CemiOutputDefinition;

public class CemiOutputDefinitionFileType extends CuXmlBatchInputFileTypeBase<CemiOutputDefinition> {

@Override
public String getFileTypeIdentifier() {
return CemiBaseConstants.CEMI_OUTPUT_DEFINITION_FILE_TYPE_IDENTIFIER;
}

@Override
public String getTitleKey() {
return CUKFSKeyConstants.MESSAGE_BATCH_UPLOAD_TITLE_CEMI_OUTPUT_DEFINITION;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package edu.cornell.kfs.sys.batch.service.impl;

import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.Validate;
import org.kuali.kfs.sys.KFSConstants;

import com.opencsv.CSVParserBuilder;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import com.opencsv.CSVWriter;
import com.opencsv.ICSVParser;

public class CemiCsvReader implements Closeable {

private final FileInputStream inputStream;
private final InputStreamReader streamReader;
private final CSVReader csvReader;
private final File inputFile;

public CemiCsvReader(final String inputFileName) throws IOException {
this(convertToFile(inputFileName));
}

private static File convertToFile(final String inputFileName) {
Validate.notBlank(inputFileName, "inputFileName cannot be blank");
return new File(inputFileName);
}

public CemiCsvReader(final File inputFile) throws IOException {
Validate.notNull(inputFile, "inputFile cannot be null");

FileInputStream inputStream = null;
InputStreamReader streamReader = null;
CSVReader csvReader = null;
boolean success = false;

try {
inputStream = new FileInputStream(inputFile);
streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
csvReader = buildCSVReader(streamReader);
this.inputStream = inputStream;
this.streamReader = streamReader;
this.csvReader = csvReader;
this.inputFile = inputFile;
success = true;
} finally {
if (!success) {
IOUtils.closeQuietly(csvReader, streamReader, inputStream);
}
}
}

private static CSVReader buildCSVReader(final Reader fileReader) {
final ICSVParser csvParser = new CSVParserBuilder()
.withSeparator(KFSConstants.COMMA.charAt(0))
.withQuoteChar(CSVWriter.DEFAULT_QUOTE_CHARACTER)
.build();

return new CSVReaderBuilder(fileReader)
.withCSVParser(csvParser)
.build();
}

@Override
public void close() throws IOException {
IOUtils.closeQuietly(csvReader, streamReader, inputStream);
}

public Iterator<String[]> iterator() {
return csvReader.iterator();
}

public CSVReader getCsvReader() {
return csvReader;
}

public File getInputFile() {
return inputFile;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package edu.cornell.kfs.sys.batch.service.impl;

import java.io.Closeable;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.Validate;
import org.kuali.kfs.sys.KFSConstants;

import com.opencsv.CSVWriter;
import com.opencsv.CSVWriterBuilder;
import com.opencsv.ICSVWriter;

public class CemiCsvWriter implements Closeable {

private final FileOutputStream outputStream;
private final OutputStreamWriter streamWriter;
private final ICSVWriter csvWriter;
private final String outputFileName;

public CemiCsvWriter(final String outputFileName) throws IOException {
Validate.notBlank(outputFileName, "outputFileName cannot be blank");

FileOutputStream outputStream = null;
OutputStreamWriter streamWriter = null;
ICSVWriter csvWriter = null;
boolean success = false;

try {
outputStream = new FileOutputStream(outputFileName);
streamWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
csvWriter = buildCSVWriter(streamWriter);
this.outputStream = outputStream;
this.streamWriter = streamWriter;
this.csvWriter = csvWriter;
this.outputFileName = outputFileName;
success = true;
} finally {
if (!success) {
IOUtils.closeQuietly(csvWriter, streamWriter, outputStream);
}
}
}

private static ICSVWriter buildCSVWriter(final Writer fileWriter) {
return new CSVWriterBuilder(fileWriter)
.withSeparator(KFSConstants.COMMA.charAt(0))
.withQuoteChar(CSVWriter.DEFAULT_QUOTE_CHARACTER)
.withLineEnd(KFSConstants.NEWLINE)
.build();
}

@Override
public void close() throws IOException {
IOUtils.closeQuietly(csvWriter, streamWriter, outputStream);
}

public void writeNext(final String[] nextLine) {
csvWriter.writeNext(nextLine);
}

public ICSVWriter getCsvWriter() {
return csvWriter;
}

public String getOutputFileName() {
return outputFileName;
}

}
Loading