From ad570809aac451390d58617062a0e95000ec8a5c Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 6 Dec 2010 17:09:13 +0000
Subject: [PATCH] [LMS-1907] refactorization: simplify NamedInputStream (no
 need to work on byte array); fixed encoding in upload of library

SVN: 19018
---
 .../cisd/common/utilities/UnicodeUtils.java   |  7 ++
 .../shared/parser/NamedInputStream.java       | 20 ++--
 .../parser/SampleUploadSectionsParser.java    | 94 +++++++++++--------
 .../client/web/server/DataSetLoader.java      |  3 +-
 .../client/web/server/ExperimentLoader.java   |  3 +-
 .../web/server/GenericClientService.java      | 15 +--
 .../client/web/server/MaterialLoader.java     |  3 +-
 .../web/server/UpdatedExperimentLoader.java   |  3 +-
 .../client/web/server/LibraryExtractor.java   |  5 +-
 .../LibraryEntityRegistrator.java             |  4 +-
 .../ScreeningLibraryTransformer.java          | 16 +++-
 11 files changed, 98 insertions(+), 75 deletions(-)

diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java b/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java
index 5bf5236b4ad..27cedb5aa70 100644
--- a/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java
+++ b/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java
@@ -20,6 +20,7 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
 
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 
@@ -38,6 +39,12 @@ public final class UnicodeUtils
         // Can not be instantiated.
     }
 
+    /** @returns {@link Charset} for {@link #DEFAULT_UNICODE_CHARSET} */
+    public final static Charset getDefaultUnicodeCharset()
+    {
+        return Charset.forName(UnicodeUtils.DEFAULT_UNICODE_CHARSET);
+    }
+
     /**
      * @return {@link Reader} that uses the default Unicode encoding.
      * @throws EnvironmentFailureException if the encoding is not supported (shouldn't happen).
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/NamedInputStream.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/NamedInputStream.java
index 5556981bdb0..23c90fd4610 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/NamedInputStream.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/NamedInputStream.java
@@ -17,11 +17,13 @@
 package ch.systemsx.cisd.openbis.generic.shared.parser;
 
 import java.io.InputStream;
+import java.io.Reader;
 
-import org.springframework.web.multipart.MultipartFile;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 
 /**
  * @author Izabela Adamczyk
+ * @author Piotr Buczek
  */
 public class NamedInputStream
 {
@@ -30,15 +32,15 @@ public class NamedInputStream
 
     private final String originalName;
 
-    private final byte[] bytes;
-
-    public NamedInputStream(InputStream stream, String originalName, byte[] bytes)
+    public NamedInputStream(InputStream stream, String originalName)
     {
         this.stream = stream;
         this.originalName = originalName;
-        this.bytes = bytes;
     }
 
+    /**
+     * NOTE: use {@link #getUnicodeReader()} to get Unicode characters.
+     */
     public InputStream getInputStream()
     {
         return stream;
@@ -50,10 +52,12 @@ public class NamedInputStream
     }
 
     /**
-     * @see MultipartFile#getBytes()
+     * @return Reader of unicode characters from this input stream
+     *         <p>
+     *         Use {@link #getInputStream()} instead to get raw input stream.
      */
-    public byte[] getBytes()
+    public Reader getUnicodeReader()
     {
-        return bytes;
+        return UnicodeUtils.createReader(stream);
     }
 }
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 c96860d8869..4bf7ad36ab8 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,6 @@ package ch.systemsx.cisd.openbis.generic.shared.parser;
 import java.io.InputStream;
 import java.io.Reader;
 import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -95,33 +94,27 @@ public class SampleUploadSectionsParser
     {
         final List<NewSamplesWithTypes> newSamples = new ArrayList<NewSamplesWithTypes>();
         boolean isAutoGenerateCodes = (sampleCodeGeneratorOrNull != null);
-        try
-        {
-            final List<BatchRegistrationResult> results =
-                    loadSamplesFromFiles(files, sampleType, isAutoGenerateCodes, newSamples,
-                            allowExperiments, operationKind);
+        final List<BatchRegistrationResult> results =
+                loadSamplesFromFiles(files, sampleType, isAutoGenerateCodes, newSamples,
+                        allowExperiments, operationKind);
 
-            if (defaultGroupIdentifier != null)
+        if (defaultGroupIdentifier != null)
+        {
+            switch (operationKind)
             {
-                switch (operationKind)
-                {
-                    case REGISTRATION:
-                        if (isAutoGenerateCodes)
-                        {
-                            generateIdentifiers(defaultGroupIdentifier, sampleCodeGeneratorOrNull,
-                                    isAutoGenerateCodes, newSamples);
-                        }
-                        break;
-                    case UPDATE:
-                        fillIdentifiers(defaultGroupIdentifier, newSamples);
-                        break;
-                }
+                case REGISTRATION:
+                    if (isAutoGenerateCodes)
+                    {
+                        generateIdentifiers(defaultGroupIdentifier, sampleCodeGeneratorOrNull,
+                                isAutoGenerateCodes, newSamples);
+                    }
+                    break;
+                case UPDATE:
+                    fillIdentifiers(defaultGroupIdentifier, newSamples);
+                    break;
             }
-            return new BatchSamplesOperation(newSamples, results, parseCodes(newSamples));
-        } catch (UnsupportedEncodingException ex)
-        {
-            throw new UserFailureException(ex.getMessage());
         }
+        return new BatchSamplesOperation(newSamples, results, parseCodes(newSamples));
     }
 
     private static String[] parseCodes(final List<NewSamplesWithTypes> newSamples)
@@ -167,19 +160,43 @@ public class SampleUploadSectionsParser
 
     static class FileSection
     {
-        private final String content;
+        private final String contentOrNull;
+
+        private final InputStream contentStreamOrNull;
 
         private final String sectionName;
 
-        public FileSection(String content, String sectionName)
+        // assumption that the given string is encoded using Unicode
+        public static FileSection createFromString(String content, String sectionName)
+        {
+            return new FileSection(content, sectionName, null);
+        }
+
+        public static FileSection createFromInputStream(InputStream contentStream,
+                String sectionName)
         {
+            return new FileSection(null, sectionName, contentStream);
+        }
+
+        private FileSection(String contentOrNull, String sectionName,
+                InputStream contentStreamOrNull)
+        {
+            assert (contentOrNull != null && contentStreamOrNull == null)
+                    || (contentOrNull == null && contentStreamOrNull != null);
             this.sectionName = sectionName;
-            this.content = content;
+            this.contentOrNull = contentOrNull;
+            this.contentStreamOrNull = contentStreamOrNull;
         }
 
-        public String getContent()
+        public Reader getContentReader()
         {
-            return content;
+            if (contentOrNull != null)
+            {
+                return new StringReader(contentOrNull);
+            } else
+            {
+                return UnicodeUtils.createReader(contentStreamOrNull);
+            }
         }
 
         public String getSectionName()
@@ -188,13 +205,11 @@ public class SampleUploadSectionsParser
         }
     }
 
-    private static List<FileSection> extractSections(InputStream stream)
+    private static List<FileSection> extractSections(Reader reader)
     {
         List<FileSection> sections = new ArrayList<FileSection>();
-        Reader reader = null;
         try
         {
-            reader = UnicodeUtils.createReader(stream);
             LineIterator it = IOUtils.lineIterator(reader);
             StringBuilder sb = null;
             String sectionName = null;
@@ -206,7 +221,7 @@ public class SampleUploadSectionsParser
                 {
                     if (sectionName != null && sb != null)
                     {
-                        sections.add(new FileSection(sb.toString(), sectionName));
+                        sections.add(FileSection.createFromString(sb.toString(), sectionName));
                     }
                     sectionName = newSectionName;
                     sb = new StringBuilder();
@@ -223,7 +238,7 @@ public class SampleUploadSectionsParser
                 }
                 if (it.hasNext() == false)
                 {
-                    sections.add(new FileSection(sb.toString(), sectionName));
+                    sections.add(FileSection.createFromString(sb.toString(), sectionName));
                 }
             }
         } finally
@@ -255,7 +270,6 @@ public class SampleUploadSectionsParser
             Collection<NamedInputStream> uploadedFiles, SampleType sampleType,
             boolean isAutoGenerateCodes, final List<NewSamplesWithTypes> newSamples,
             boolean allowExperiments, BatchOperationKind operationKind)
-            throws UnsupportedEncodingException
     {
         final List<BatchRegistrationResult> results =
                 new ArrayList<BatchRegistrationResult>(uploadedFiles.size());
@@ -264,16 +278,16 @@ public class SampleUploadSectionsParser
             List<FileSection> sampleSections = new ArrayList<FileSection>();
             if (sampleType.isDefinedInFileEntityTypeCode())
             {
-                sampleSections.addAll(extractSections(multipartFile.getInputStream()));
+                sampleSections.addAll(extractSections(multipartFile.getUnicodeReader()));
             } else
             {
-                sampleSections.add(new FileSection(new String(multipartFile.getBytes(),
-                        UnicodeUtils.DEFAULT_UNICODE_CHARSET), sampleType.getCode()));
+                sampleSections.add(FileSection.createFromInputStream(
+                        multipartFile.getInputStream(), sampleType.getCode()));
             }
             int sampleCounter = 0;
             for (FileSection fs : sampleSections)
             {
-                final StringReader stringReader = new StringReader(fs.getContent());
+                Reader reader = fs.getContentReader();
                 SampleType typeFromSection = new SampleType();
                 typeFromSection.setCode(fs.getSectionName());
                 final BisTabFileLoader<NewSample> tabFileLoader =
@@ -282,7 +296,7 @@ public class SampleUploadSectionsParser
                 String sectionInFile =
                         sampleSections.size() == 1 ? "" : " (section:" + fs.getSectionName() + ")";
                 final List<NewSample> loadedSamples =
-                        tabFileLoader.load(new DelegatedReader(stringReader, multipartFile
+                        tabFileLoader.load(new DelegatedReader(reader, multipartFile
                                 .getOriginalFilename() + sectionInFile));
                 if (loadedSamples.size() > 0)
                 {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/DataSetLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/DataSetLoader.java
index 84427112c89..a53b7407149 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/DataSetLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/DataSetLoader.java
@@ -25,7 +25,6 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
-import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
@@ -61,7 +60,7 @@ public class DataSetLoader
         results = new ArrayList<BatchRegistrationResult>(files.size());
         for (final NamedInputStream file : files)
         {
-            final Reader reader = UnicodeUtils.createReader(file.getInputStream());
+            final Reader reader = file.getUnicodeReader();
             final List<NewDataSet> loadedMaterials =
                     tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename()));
             newObjects.addAll(loadedMaterials);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/ExperimentLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/ExperimentLoader.java
index 23b9e0b945f..e46cb10816a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/ExperimentLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/ExperimentLoader.java
@@ -26,7 +26,6 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
-import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewBasicExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
@@ -64,7 +63,7 @@ public class ExperimentLoader
         results = new ArrayList<BatchRegistrationResult>(files.size());
         for (final NamedInputStream file : files)
         {
-            final Reader reader = UnicodeUtils.createReader(file.getInputStream());
+            final Reader reader = file.getUnicodeReader();
             final List<NewBasicExperiment> loadedExperiments =
                     tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename()));
             newExperiments.addAll(loadedExperiments);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index 8c19f982985..1c9b8c22812 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -259,8 +259,7 @@ public class GenericClientService extends AbstractClientService implements IGene
                     new ArrayList<NamedInputStream>(uploadedFiles.size());
             for (IUncheckedMultipartFile f : uploadedFiles.iterable())
             {
-                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename(), f
-                        .getBytes()));
+                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename()));
             }
             return SampleUploadSectionsParser.prepareSamples(sampleType, files,
                     defaultGroupIdentifier, sampleCodeGeneratorOrNull, allowExperiments,
@@ -369,8 +368,7 @@ public class GenericClientService extends AbstractClientService implements IGene
                     new ArrayList<NamedInputStream>(uploadedFiles.size());
             for (IUncheckedMultipartFile f : uploadedFiles.iterable())
             {
-                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename(), f
-                        .getBytes()));
+                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename()));
             }
             ExperimentLoader loader = new ExperimentLoader();
             loader.load(files);
@@ -392,8 +390,7 @@ public class GenericClientService extends AbstractClientService implements IGene
                     new ArrayList<NamedInputStream>(uploadedFiles.size());
             for (IUncheckedMultipartFile f : uploadedFiles.iterable())
             {
-                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename(), f
-                        .getBytes()));
+                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename()));
             }
             MaterialLoader loader = new MaterialLoader();
             loader.load(files);
@@ -556,8 +553,7 @@ public class GenericClientService extends AbstractClientService implements IGene
                     new ArrayList<NamedInputStream>(uploadedFiles.size());
             for (IUncheckedMultipartFile f : uploadedFiles.iterable())
             {
-                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename(), f
-                        .getBytes()));
+                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename()));
             }
             DataSetLoader loader = new DataSetLoader();
             loader.load(files);
@@ -586,8 +582,7 @@ public class GenericClientService extends AbstractClientService implements IGene
                     new ArrayList<NamedInputStream>(uploadedFiles.size());
             for (IUncheckedMultipartFile f : uploadedFiles.iterable())
             {
-                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename(), f
-                        .getBytes()));
+                files.add(new NamedInputStream(f.getInputStream(), f.getOriginalFilename()));
             }
             UpdatedExperimentLoader loader = new UpdatedExperimentLoader();
             loader.load(files);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java
index 613a18dd227..065cc012372 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java
@@ -10,7 +10,6 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
-import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
@@ -41,7 +40,7 @@ public class MaterialLoader
         results = new ArrayList<BatchRegistrationResult>(files.size());
         for (final NamedInputStream file : files)
         {
-            final Reader reader = UnicodeUtils.createReader(file.getInputStream());
+            final Reader reader = file.getUnicodeReader();
             final List<NewMaterial> loadedMaterials =
                     tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename()));
             newMaterials.addAll(loadedMaterials);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/UpdatedExperimentLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/UpdatedExperimentLoader.java
index a5ef23ae77a..12d79fc40f0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/UpdatedExperimentLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/UpdatedExperimentLoader.java
@@ -26,7 +26,6 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
-import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UpdatedBasicExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
@@ -64,7 +63,7 @@ public class UpdatedExperimentLoader
         results = new ArrayList<BatchRegistrationResult>(files.size());
         for (final NamedInputStream file : files)
         {
-            final Reader reader = UnicodeUtils.createReader(file.getInputStream());
+            final Reader reader = file.getUnicodeReader();
             final List<UpdatedBasicExperiment> loadedExperiments =
                     tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename()));
             newExperiments.addAll(loadedExperiments);
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/LibraryExtractor.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/LibraryExtractor.java
index 3001cfc0f38..a8773b455e5 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/LibraryExtractor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/LibraryExtractor.java
@@ -106,8 +106,7 @@ class LibraryExtractor
         BatchSamplesOperation prepared =
                 SampleUploadSectionsParser.prepareSamples(typeInFile, Arrays
                         .asList(new NamedInputStream(new FileInputStream(platesFile), platesFile
-                                .getName(), null)), null, null, true,
-                        BatchOperationKind.REGISTRATION);
+                                .getName())), null, null, true, BatchOperationKind.REGISTRATION);
         List<NewSamplesWithTypes> samples = prepared.getSamples();
         setUpdatableTypes(samples);
         return samples;
@@ -125,7 +124,7 @@ class LibraryExtractor
     {
         MaterialLoader loader = new MaterialLoader();
         loader.load(Arrays.asList(new NamedInputStream(new FileInputStream(genesFile), genesFile
-                .getName(), null)));
+                .getName())));
         return loader.getNewMaterials();
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/library_tools/LibraryEntityRegistrator.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/library_tools/LibraryEntityRegistrator.java
index ab65c746953..fb1face1d11 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/library_tools/LibraryEntityRegistrator.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/library_tools/LibraryEntityRegistrator.java
@@ -30,6 +30,7 @@ import java.util.Set;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants;
 
 /**
@@ -114,7 +115,8 @@ public class LibraryEntityRegistrator
 
         private void writeLine(String line) throws IOException
         {
-            IOUtils.writeLines(Arrays.asList(line), "\n", stream);
+            IOUtils.writeLines(Arrays.asList(line), "\n", stream,
+                    UnicodeUtils.DEFAULT_UNICODE_CHARSET);
         }
 
         public void close() throws IOException
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/library_tools/ScreeningLibraryTransformer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/library_tools/ScreeningLibraryTransformer.java
index 5393aa87230..3f9e18ad982 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/library_tools/ScreeningLibraryTransformer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/library_tools/ScreeningLibraryTransformer.java
@@ -21,12 +21,12 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.charset.Charset;
 
 import com.csvreader.CsvReader;
 
 import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 
 /**
  * Transforms a screening library file and produces files which can be uploaded to openBIS: genes,
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException;
  */
 public class ScreeningLibraryTransformer
 {
-    private final static char SEPARATOR = ',';
+    private final static char SEPARATOR = ','; // TODO parametrize
 
     private static final String GENES_FILE_NAME = "genes.txt";
 
@@ -79,9 +79,10 @@ public class ScreeningLibraryTransformer
             String plateGeometry, String groupCode, String genesFile, String oligosFile,
             String platesFile)
     {
+        CsvReader csvReader = null;
         try
         {
-            CsvReader csvReader = readFile(input);
+            csvReader = readFile(input);
             boolean headerPresent = csvReader.readRecord();
             if (headerPresent == false)
             {
@@ -99,18 +100,23 @@ public class ScreeningLibraryTransformer
                 registrator.register(extractor, row);
             }
             registrator.saveResults();
-            csvReader.close();
             return Status.OK;
         } catch (Exception ex)
         {
             return Status.createError(ex.getMessage());
+        } finally
+        {
+            if (csvReader != null)
+            {
+                csvReader.close();
+            }
         }
     }
 
     static CsvReader readFile(InputStream input) throws FileNotFoundException, IOException,
             UserFailureException
     {
-        CsvReader csvReader = new CsvReader(input, Charset.defaultCharset());
+        CsvReader csvReader = new CsvReader(input, UnicodeUtils.getDefaultUnicodeCharset());
         csvReader.setDelimiter(SEPARATOR);
         csvReader.setSafetySwitch(false);
         return csvReader;
-- 
GitLab