diff --git a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java index 922dd9be2e6537fa49b196a3754dad0f7c9bce81..069b8686ddcdfc8dd969de30e0218e30b86ebc8b 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java +++ b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.common.parser; import java.io.File; +import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; @@ -28,6 +29,7 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.Set; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; import org.apache.commons.lang.StringUtils; @@ -36,6 +38,7 @@ import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked; import ch.systemsx.cisd.common.exceptions.NotImplementedException; import ch.systemsx.cisd.common.parser.filter.AlwaysAcceptLineFilter; import ch.systemsx.cisd.common.parser.filter.ILineFilter; +import ch.systemsx.cisd.common.utilities.UnicodeUtils; /** * Convenient class to load (or iterate over) a tab file, a reader or a stream. The loader delivers @@ -143,17 +146,17 @@ public class TabFileLoader<T> assert file != null : "Given file must not be null"; assert file.isFile() : "Given file '" + file.getAbsolutePath() + "' is not a file."; - FileReader reader = null; + FileInputStream inputStream = null; try { - reader = new FileReader(file); - return load(reader); + inputStream = FileUtils.openInputStream(file); + return load(inputStream); } catch (final IOException ex) { throw new IOExceptionUnchecked(ex); } finally { - IOUtils.closeQuietly(reader); + IOUtils.closeQuietly(inputStream); } } @@ -476,7 +479,8 @@ public class TabFileLoader<T> private Iterator<Line> createLineIterator(final InputStream stream) throws IOException { - final LineIterator lineIterator = IOUtils.lineIterator(stream, "UTF-8"); + final LineIterator lineIterator = + IOUtils.lineIterator(stream, UnicodeUtils.DEFAULT_UNICODE_CHARSET); final Iterator<Line> iterator = new TabFileLineIterator(lineIterator); return iterator; } diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java b/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..5bf5236b4ad7d6c17db6dedd21f746098d15d8da --- /dev/null +++ b/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java @@ -0,0 +1,67 @@ +/* + * Copyright 2007 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.common.utilities; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.UnsupportedEncodingException; + +import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; + +/** + * Utilities for dealing with file encoding. + * + * @author Piotr Buczek + */ +public final class UnicodeUtils +{ + /** default Unicode encoding used for strings - UTF-8 */ + public static final String DEFAULT_UNICODE_CHARSET = "UTF-8"; + + private UnicodeUtils() + { + // Can not be instantiated. + } + + /** + * @return {@link Reader} that uses the default Unicode encoding. + * @throws EnvironmentFailureException if the encoding is not supported (shouldn't happen). + * @see #DEFAULT_UNICODE_CHARSET + */ + public final static Reader createReader(InputStream inputStream) + throws EnvironmentFailureException + { + return createReader(inputStream, DEFAULT_UNICODE_CHARSET); + } + + /** + * @return {@link Reader} that uses the given encoding. + * @throws EnvironmentFailureException if the encoding is not supported. + */ + public final static Reader createReader(InputStream inputStream, String encoding) + throws EnvironmentFailureException + { + try + { + return new InputStreamReader(inputStream, encoding); + } catch (UnsupportedEncodingException ex) + { + throw new EnvironmentFailureException(ex.getMessage()); + } + } +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java index 3d76de87ee2bad680fa7fd00613a6ce014e5200f..31e3619b9f01ed80fb2422af54df522c61db157a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java @@ -16,8 +16,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; +import java.io.Reader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -41,6 +40,7 @@ import ch.systemsx.cisd.common.parser.ParserException; import ch.systemsx.cisd.common.servlet.IRequestContextProvider; import ch.systemsx.cisd.common.spring.IUncheckedMultipartFile; import ch.systemsx.cisd.common.utilities.BeanUtils; +import ch.systemsx.cisd.common.utilities.UnicodeUtils; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientService; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ArchivingResult; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.AttachmentVersions; @@ -79,7 +79,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.translator.UserFailure import ch.systemsx.cisd.openbis.generic.client.web.server.util.TSVRenderer; import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; import ch.systemsx.cisd.openbis.generic.shared.IServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId; import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder; @@ -1288,18 +1287,9 @@ public final class CommonClientService extends AbstractClientService implements final List<VocabularyTerm> results = new ArrayList<VocabularyTerm>(); for (final IUncheckedMultipartFile multipartFile : uploadedFiles.iterable()) { - StringReader stringReader; - try - { - stringReader = - new StringReader(new String(multipartFile.getBytes(), - BasicConstant.UTF_ENCODING)); - } catch (UnsupportedEncodingException ex) - { - throw new UserFailureException(ex.getMessage()); - } + Reader reader = UnicodeUtils.createReader(multipartFile.getInputStream()); final List<VocabularyTerm> loadedTerms = - tabFileLoader.load(new DelegatedReader(stringReader, multipartFile + tabFileLoader.load(new DelegatedReader(reader, multipartFile .getOriginalFilename())); results.addAll(loadedTerms); } @@ -1311,7 +1301,6 @@ public final class CommonClientService extends AbstractClientService implements } return results; } - } public void addVocabularyTerms(TechId vocabularyId, List<String> vocabularyTerms, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/FileExportServiceServlet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/FileExportServiceServlet.java index 38b6a1a6dbdfa441c0db6c960dc9a06b2d0c2c79..989f6f3934ea768e53d98b7999d842970e2d2d83 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/FileExportServiceServlet.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/FileExportServiceServlet.java @@ -23,6 +23,7 @@ import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; +import ch.systemsx.cisd.common.utilities.UnicodeUtils; import ch.systemsx.cisd.common.utilities.OSKind; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientService; import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; @@ -51,7 +52,7 @@ public class FileExportServiceServlet extends AbstractFileDownloadServlet OSKind osKind = HttpUtils.figureOperatingSystemKind(request); String lineSeparator = osKind.getLineSeparator(); String fileContent = service.getExportTable(exportDataKey, lineSeparator); - byte[] value = fileContent.getBytes(); + byte[] value = fileContent.getBytes(UnicodeUtils.DEFAULT_UNICODE_CHARSET); String fileName = "exportedData.txt"; return new FileContent(value, fileName); } else diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java index 4d12959e56a12651f26dec52ad4073ba44ec258a..ac26dc4a7bf15576330e04d48b049f4d0c0164e0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java @@ -23,9 +23,6 @@ package ch.systemsx.cisd.openbis.generic.shared.basic; */ public class BasicConstant { - /** default encoding used for strings - UTF-8 */ - public static final String UTF_ENCODING = "UTF-8"; - /** Maximum length of a file name for uploading data sets to CIFEX. */ public static final int MAX_LENGTH_OF_FILE_NAME = 250; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/BisTabFileLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/BisTabFileLoader.java index ea470420dc63e4db88eb5ef0df8423830dcfc489..675bf2e929e823802f48278dcd57eb496a92d1dd 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/BisTabFileLoader.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/BisTabFileLoader.java @@ -67,8 +67,8 @@ public final class BisTabFileLoader<T> extends TabFileLoader<T> final NamedReader namedReader) { final String message = ex.getMessage(); - throw UserFailureException.fromTemplate(ERROR_IN_FILE_MESSAGE_FORMAT, namedReader - .getReaderName(), message); + throw UserFailureException.fromTemplate(ERROR_IN_FILE_MESSAGE_FORMAT, + namedReader.getReaderName(), message); } // 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 39828304027871c992a024d53e4d3e19da4da0e0..c96860d886989b123ad4aeb04c04743f2858311b 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 @@ -17,7 +17,7 @@ package ch.systemsx.cisd.openbis.generic.shared.parser; import java.io.InputStream; -import java.io.InputStreamReader; +import java.io.Reader; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; @@ -33,7 +33,7 @@ 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.openbis.generic.shared.basic.BasicConstant; +import ch.systemsx.cisd.common.utilities.UnicodeUtils; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; @@ -191,9 +191,10 @@ public class SampleUploadSectionsParser private static List<FileSection> extractSections(InputStream stream) { List<FileSection> sections = new ArrayList<FileSection>(); - InputStreamReader reader = new InputStreamReader(stream); + Reader reader = null; try { + reader = UnicodeUtils.createReader(stream); LineIterator it = IOUtils.lineIterator(reader); StringBuilder sb = null; String sectionName = null; @@ -267,7 +268,7 @@ public class SampleUploadSectionsParser } else { sampleSections.add(new FileSection(new String(multipartFile.getBytes(), - BasicConstant.UTF_ENCODING), sampleType.getCode())); + UnicodeUtils.DEFAULT_UNICODE_CHARSET), sampleType.getCode())); } int sampleCounter = 0; for (FileSection fs : sampleSections) 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 9b9c6367a817e4d93619ef552f2465ee99a95eef..84427112c89ea6b9054d653d89e1bf8a093e8280 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 @@ -15,7 +15,6 @@ */ package ch.systemsx.cisd.openbis.plugin.generic.client.web.server; -import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; @@ -26,6 +25,7 @@ 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 +61,7 @@ public class DataSetLoader results = new ArrayList<BatchRegistrationResult>(files.size()); for (final NamedInputStream file : files) { - final Reader reader = new InputStreamReader(file.getInputStream()); + final Reader reader = UnicodeUtils.createReader(file.getInputStream()); 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 7a2ce897af5e36e30c2d153ec0980fbdb2920927..23b9e0b945f4b56f697fd56841174b68d8be3942 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 @@ -16,7 +16,6 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.server; -import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; @@ -27,6 +26,7 @@ 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 +64,7 @@ public class ExperimentLoader results = new ArrayList<BatchRegistrationResult>(files.size()); for (final NamedInputStream file : files) { - final Reader reader = new InputStreamReader(file.getInputStream()); + final Reader reader = UnicodeUtils.createReader(file.getInputStream()); 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/MaterialLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java index ea7f61fc61df827b5867866e5aa35665e5290d13..613a18dd2275e18f23132609e9bf0635821335a9 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 @@ -1,6 +1,5 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.server; -import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; @@ -11,6 +10,7 @@ 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 +41,7 @@ public class MaterialLoader results = new ArrayList<BatchRegistrationResult>(files.size()); for (final NamedInputStream file : files) { - final Reader reader = new InputStreamReader(file.getInputStream()); + final Reader reader = UnicodeUtils.createReader(file.getInputStream()); 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 abc6eeff31440fc7074b743e528a480fc3baadff..a5ef23ae77aae32759daada1047589695360416c 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 @@ -16,7 +16,6 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.server; -import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; @@ -27,6 +26,7 @@ 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 +64,7 @@ public class UpdatedExperimentLoader results = new ArrayList<BatchRegistrationResult>(files.size()); for (final NamedInputStream file : files) { - final Reader reader = new InputStreamReader(file.getInputStream()); + final Reader reader = UnicodeUtils.createReader(file.getInputStream()); final List<UpdatedBasicExperiment> loadedExperiments = tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename())); newExperiments.addAll(loadedExperiments);