diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/ExcelFileSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/ExcelFileSection.java index 1f81c132aa134034f6395e1a1e343319a81ebc22..9e9c052d2f8fd6b00f989620ab65c4c1d0fc3e7a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/ExcelFileSection.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/ExcelFileSection.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.shared.parser; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import org.apache.commons.io.IOUtils; @@ -104,77 +105,115 @@ public class ExcelFileSection } } + public static List<ExcelFileSection> extractSectionsFromWorkBook(Workbook wb, + String excelSheetName) + { + LinkedList<ExcelFileSection> sections = new LinkedList<ExcelFileSection>(); + List<ExcelFileSection> defaultSheetSections = null; + + Sheet sheet = null; + String prefix = excelSheetName + "-"; + for (int i = 0; i < wb.getNumberOfSheets(); i++) + { + String sheetName = wb.getSheetName(i); + if (excelSheetName.equalsIgnoreCase(sheetName)) + { + sheet = wb.getSheetAt(i); + defaultSheetSections = extractSectionsFromDefaultSheet(sheet); + } else if (sheetName.startsWith(prefix)) + { + String sectionName = sheetName.substring(prefix.length()); + sheet = wb.getSheetAt(i); + if (SECTION_FILE_DEFAULT.equalsIgnoreCase(sectionName)) + { + sections.addFirst(new ExcelFileSection(sheet, sectionName, 0, sheet + .getLastRowNum())); + } else + { + sections.add(new ExcelFileSection(sheet, sectionName, 0, sheet.getLastRowNum())); + } + } + } + + // default sheet sections must be at the end of the file + if (defaultSheetSections != null) + { + sections.addAll(defaultSheetSections); + } + + return sections; + } + public static List<ExcelFileSection> extractSections(InputStream stream, String excelSheetName, String fileName) { - List<ExcelFileSection> sections = new ArrayList<ExcelFileSection>(); try { Workbook wb = getWorkBook(stream, fileName); - Sheet sheet = null; if (excelSheetName == null) { - sheet = wb.getSheetAt(0); + return extractSectionsFromDefaultSheet(wb.getSheetAt(0)); } else { - for (int i = 0; i < wb.getNumberOfSheets(); i++) - { - if (excelSheetName.equalsIgnoreCase(wb.getSheetName(i))) - { - sheet = wb.getSheetAt(i); - break; - } - } - if (sheet == null) - { - return sections; - } + return extractSectionsFromWorkBook(wb, excelSheetName); } - String sectionName = null; - Integer begin = null; - for (Row row : sheet) + } catch (IOException e) + { + throw new IOExceptionUnchecked(e); + } finally + { + IOUtils.closeQuietly(stream); + } + } + + private static final List<ExcelFileSection> extractSectionsFromDefaultSheet(Sheet sheet) + { + List<ExcelFileSection> sections = new ArrayList<ExcelFileSection>(); + + if (sheet == null) + { + return sections; + } + + String sectionName = null; + Integer begin = null; + for (Row row : sheet) + { + String newSectionName = tryGetSectionName(row); + if (newSectionName != null) { - String newSectionName = tryGetSectionName(row); - if (newSectionName != null) + if (sectionName != null && begin != null) { - if (sectionName != null && begin != null) + if (sectionName.equals(newSectionName)) { - if (sectionName.equals(newSectionName)) - { - continue; - } - if (newSectionName.equals(SECTION_FILE_DEFAULT)) - { - continue; - } else - { - sections.add(new ExcelFileSection(sheet, sectionName, begin, row - .getRowNum() - 1)); - sectionName = newSectionName; - begin = row.getRowNum() + 1; - } + continue; + } + if (newSectionName.equals(SECTION_FILE_DEFAULT)) + { + continue; } else { + sections.add(new ExcelFileSection(sheet, sectionName, begin, row + .getRowNum() - 1)); sectionName = newSectionName; begin = row.getRowNum() + 1; } - } else if (sectionName == null || begin == null) - { - throw new UserFailureException("Discovered the unnamed section in the file"); - } - if (row.getRowNum() == sheet.getLastRowNum()) + } else { - sections.add(new ExcelFileSection(sheet, sectionName, begin, row.getRowNum())); + sectionName = newSectionName; + begin = row.getRowNum() + 1; } + } else if (sectionName == null || begin == null) + { + throw new UserFailureException("Discovered the unnamed section in the file"); + } + if (row.getRowNum() == sheet.getLastRowNum()) + { + sections.add(new ExcelFileSection(sheet, sectionName, begin, row.getRowNum())); } - } catch (IOException e) - { - throw new IOExceptionUnchecked(e); - } finally - { - IOUtils.closeQuietly(stream); } + return sections; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/SampleUploadSectionsParser.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/SampleUploadSectionsParser.java index 66f5ed50f856a07f108e9e2e6e959b2e0d9dfdcb..cc1c99a61e084191d063df10bdcefd7cb3ad6d4a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/SampleUploadSectionsParser.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/SampleUploadSectionsParser.java @@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.generic.shared.parser; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -206,14 +206,13 @@ public class SampleUploadSectionsParser multipartFile.getInputStream(), sampleType.getCode(), loweredFileName)); } int sampleCounter = 0; - Map<String, String> defaults = Collections.emptyMap(); + Map<String, String> defaults = new HashMap<String, String>(); for (ExcelFileSection fs : sampleSections) { if (fs.getSectionName().equals("DEFAULT")) { - defaults = - Collections.unmodifiableMap(ExcelFileLoader.parseDefaults( - fs.getSheet(), fs.getBegin(), fs.getEnd())); + defaults.putAll(ExcelFileLoader.parseDefaults(fs.getSheet(), fs.getBegin(), + fs.getEnd())); } else { SampleType typeFromSection = new SampleType(); @@ -250,14 +249,12 @@ public class SampleUploadSectionsParser multipartFile.getInputStream(), sampleType.getCode())); } int sampleCounter = 0; - Map<String, String> defaults = Collections.emptyMap(); + Map<String, String> defaults = new HashMap<String, String>(); for (FileSection fs : sampleSections) { if (fs.getSectionName().equals("DEFAULT")) { - defaults = - Collections.unmodifiableMap(TabFileLoader.parseDefaults(fs - .getContentReader())); + defaults.putAll(TabFileLoader.parseDefaults(fs.getContentReader())); } else { Reader reader = fs.getContentReader(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/parser/MaterialUploadSectionsParser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/parser/MaterialUploadSectionsParser.java index ad0acf361cce12c6cae5501f91519f0a9775ea6a..7008fe4b90d1ffc92d865c0cfd5812a5eb3bbfdb 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/parser/MaterialUploadSectionsParser.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/parser/MaterialUploadSectionsParser.java @@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.server.parser; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -126,14 +126,13 @@ public class MaterialUploadSectionsParser loweredFileName)); } int materialCounter = 0; - Map<String, String> defaults = Collections.emptyMap(); + Map<String, String> defaults = new HashMap<String, String>(); for (ExcelFileSection fs : materialSections) { if (fs.getSectionName().equals("DEFAULT")) { - defaults = - Collections.unmodifiableMap(ExcelFileLoader.parseDefaults( - fs.getSheet(), fs.getBegin(), fs.getEnd())); + defaults.putAll(ExcelFileLoader.parseDefaults(fs.getSheet(), fs.getBegin(), + fs.getEnd())); } else { MaterialType typeFromSection = new MaterialType(); @@ -180,14 +179,12 @@ public class MaterialUploadSectionsParser multipartFile.getInputStream(), materialType.getCode())); } int materialCounter = 0; - Map<String, String> defaults = Collections.emptyMap(); + Map<String, String> defaults = new HashMap<String, String>(); for (FileSection fs : materialSections) { if (fs.getSectionName().equals("DEFAULT")) { - defaults = - Collections.unmodifiableMap(TabFileLoader.parseDefaults(fs - .getContentReader())); + defaults.putAll(TabFileLoader.parseDefaults(fs.getContentReader())); } else { Reader reader = fs.getContentReader();