Search in sources :

Example 1 with CSVParser

use of com.opencsv.CSVParser in project ice by JBEI.

the class BulkCSVUpload method getBulkUploadDataFromFile.

// NOTE: this also validates the part data (with the exception of the actual files)
List<PartWithSample> getBulkUploadDataFromFile(InputStream inputStream) throws IOException {
    List<PartWithSample> partDataList = new LinkedList<>();
    // initialize parser to null; when not-null in the loop below, then the header has been parsed
    CSVParser parser = null;
    HashMap<Integer, HeaderValue> headers = null;
    // parse CSV file
    try {
        LineIterator it = IOUtils.lineIterator(inputStream, "UTF-8");
        int index = 0;
        while (it.hasNext()) {
            String line = it.nextLine().trim();
            // check if first time parsing (first line)
            if (parser == null) {
                // to indicate the type of parser to use (tab or comma separated)
                if (line.contains("\t") && !line.contains(","))
                    parser = new CSVParser('\t');
                else
                    parser = new CSVParser();
                // get column headers
                String[] fieldStrArray = parser.parseLine(line);
                headers = processColumnHeaders(fieldStrArray);
                continue;
            }
            // skip any empty lines (holes) in the csv file
            if (StringUtils.isBlank(line) || line.replaceAll(",", "").trim().isEmpty())
                continue;
            // at this point we must have headers since that should be the first item in the file
            if (headers == null)
                throw new IOException("Could not parse file headers");
            // parser != null; process line contents with available headers
            String[] valuesArray = parser.parseLine(line);
            PartData partData = new PartData(addType);
            PartSample partSample = null;
            if (subType != null) {
                partData.getLinkedParts().add(new PartData(subType));
            }
            // for each column
            for (int i = 0; i < valuesArray.length; i += 1) {
                HeaderValue headerForColumn = headers.get(i);
                // process sample information
                if (headerForColumn.isSampleField()) {
                    // todo : move to another method
                    if (partSample == null)
                        partSample = new PartSample();
                    setPartSampleData(((SampleHeaderValue) headerForColumn).getSampleField(), partSample, valuesArray[i]);
                } else {
                    EntryHeaderValue entryHeaderValue = (EntryHeaderValue) headerForColumn;
                    EntryField field = entryHeaderValue.getEntryField();
                    PartData data;
                    String value = valuesArray[i];
                    boolean isSubType = entryHeaderValue.isSubType();
                    if (isSubType)
                        data = partData.getLinkedParts().get(0);
                    else
                        data = partData;
                    // get the data for the field
                    switch(field) {
                        case ATT_FILENAME:
                            ArrayList<AttachmentInfo> attachments = data.getAttachments();
                            if (attachments == null) {
                                attachments = new ArrayList<>();
                                data.setAttachments(attachments);
                            }
                            attachments.clear();
                            attachments.add(new AttachmentInfo(value));
                            break;
                        case SEQ_FILENAME:
                            data.setSequenceFileName(value);
                            break;
                        case SEQ_TRACE_FILES:
                            // todo
                            break;
                        case EXISTING_PART_NUMBER:
                            Entry entry = DAOFactory.getEntryDAO().getByPartNumber(value);
                            if (entry == null)
                                throw new IOException("Could not locate part number \"" + value + "\" for linking");
                            PartData toLink = entry.toDataTransferObject();
                            data.getLinkedParts().add(toLink);
                            break;
                        default:
                            partData = EntryUtil.setPartDataFromField(partData, value, field, isSubType);
                    }
                }
            }
            // validate
            List<EntryField> fields = EntryUtil.validates(partData);
            if (!fields.isEmpty()) {
                invalidFields.clear();
                invalidFields.addAll(fields);
                return null;
            }
            partData.setIndex(index);
            PartWithSample partWithSample = new PartWithSample(partSample, partData);
            partDataList.add(partWithSample);
            index += 1;
        }
    } finally {
        IOUtils.closeQuietly(inputStream);
    }
    return partDataList;
}
Also used : AttachmentInfo(org.jbei.ice.lib.dto.entry.AttachmentInfo) IOException(java.io.IOException) LineIterator(org.apache.commons.io.LineIterator) LinkedList(java.util.LinkedList) EntryField(org.jbei.ice.lib.dto.entry.EntryField) Entry(org.jbei.ice.storage.model.Entry) CSVParser(com.opencsv.CSVParser) PartData(org.jbei.ice.lib.dto.entry.PartData) PartSample(org.jbei.ice.lib.dto.sample.PartSample)

Aggregations

CSVParser (com.opencsv.CSVParser)1 IOException (java.io.IOException)1 LinkedList (java.util.LinkedList)1 LineIterator (org.apache.commons.io.LineIterator)1 AttachmentInfo (org.jbei.ice.lib.dto.entry.AttachmentInfo)1 EntryField (org.jbei.ice.lib.dto.entry.EntryField)1 PartData (org.jbei.ice.lib.dto.entry.PartData)1 PartSample (org.jbei.ice.lib.dto.sample.PartSample)1 Entry (org.jbei.ice.storage.model.Entry)1