From 977b2e2203e125e91f4283ca201a6de1be145d3d Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Mon, 28 Oct 2013 09:45:00 +0000
Subject: [PATCH] SP-982, CCS-62: Threshold introduce to prevent feeding
 protein database for prot.xml files which are too large. In this case search
 experiment property NOT_PROCESSED is set to give a reason visible for the
 user on the experiment details view.

SVN: 30031
---
 .../drop-boxes/ms-search/plugin.properties    |  1 +
 ...DataSetInfoExtractorForProteinResults.java | 36 +++++++-
 .../etlserver/proteomics/ProtXMLUploader.java | 39 ++++-----
 .../openbis/etlserver/proteomics/Util.java    | 22 +++++
 ...SetInfoExtractorForProteinResultsTest.java | 85 +++++++++++++++----
 .../proteomics/ProtXMLUploaderTest.java       | 23 ++---
 6 files changed, 153 insertions(+), 53 deletions(-)

diff --git a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-search/plugin.properties b/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-search/plugin.properties
index fc80280936e..619875ae92e 100644
--- a/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-search/plugin.properties
+++ b/rtd_phosphonetx/source/core-plugins/proteomics/1/dss/drop-boxes/ms-search/plugin.properties
@@ -13,6 +13,7 @@ incoming-data-completeness-condition = auto-detection
 
 data-set-info-extractor = ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForProteinResults
 data-set-info-extractor.separator = +
+data-set-info-extractor.prot-xml-size-threshold-in-MB = 1
 
 type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor
 type-extractor.file-format-type = XML
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java
index 199e9398f7e..601fbc3d3c2 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java
@@ -21,20 +21,26 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
 
 import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.io.PropertyIOUtils;
+import ch.systemsx.cisd.common.logging.LogCategory;
+import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.common.properties.PropertyUtils;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ParentDataSetCodes;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
@@ -45,6 +51,16 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
  */
 public class DataSetInfoExtractorForProteinResults extends AbstractDataSetInfoExtractorWithService
 {
+    private static final Logger operationLog =
+            LogFactory.getLogger(LogCategory.OPERATION, DataSetInfoExtractorForProteinResults.class);
+
+    static final String NOT_PROCESSED_PROPERTY = "NOT_PROCESSED";
+
+    @Private 
+    static final String PROT_XML_SIZE_THRESHOLD = "prot-xml-size-threshold-in-MB";
+    
+    private static final int DEFAULT_PROT_XML_SIZE_THRESHOLD = 256;
+    
     @Private
     static final String EXPERIMENT_TYPE_CODE_KEY = "experiment-type-code";
     
@@ -76,6 +92,8 @@ public class DataSetInfoExtractorForProteinResults extends AbstractDataSetInfoEx
 
     private final String experimentTypeCode;
 
+    private final long protXmlSizeThreshold;
+    
     public DataSetInfoExtractorForProteinResults(Properties properties)
     {
         this(properties, ServiceProvider.getOpenBISService());
@@ -90,6 +108,8 @@ public class DataSetInfoExtractorForProteinResults extends AbstractDataSetInfoEx
                         DEFAULT_EXPERIMENT_PROPERTIES_FILE_NAME);
         experimentTypeCode =
                 properties.getProperty(EXPERIMENT_TYPE_CODE_KEY, DEFAULT_EXPERIMENT_TYPE_CODE);
+        protXmlSizeThreshold = PropertyUtils.getInt(properties, PROT_XML_SIZE_THRESHOLD, 
+                DEFAULT_PROT_XML_SIZE_THRESHOLD) * FileUtils.ONE_MB;
     }
 
     @Override
@@ -118,6 +138,20 @@ public class DataSetInfoExtractorForProteinResults extends AbstractDataSetInfoEx
         NewExperiment experiment =
                 new NewExperiment(experimentIdentifier.toString(), experimentTypeCode);
         ExperimentType experimentType = service.getExperimentType(experimentTypeCode);
+        File protXMLFile = Util.tryGetProtXMLFile(incomingDataSetPath);
+        if (protXMLFile == null)
+        {
+            throw new UserFailureException("No *prot.xml file found in data set '" + incomingDataSetPath + "'.");
+        }
+        long fileSize = protXMLFile.length();
+        if (fileSize > protXmlSizeThreshold)
+        {
+            String reason = "Size of prot.xml file " + protXMLFile.getName() + " is with "
+                    + FileUtilities.byteCountToDisplaySize(fileSize) + " too large. Maximum size is " 
+                    + FileUtilities.byteCountToDisplaySize(protXmlSizeThreshold);
+            operationLog.warn(reason);
+            properties.setProperty(NOT_PROCESSED_PROPERTY, reason);
+        }
 
         experiment.setProperties(Util.getAndCheckProperties(properties, experimentType));
         DataSetInformation info = new DataSetInformation();
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploader.java
index 6c9b459f480..4783867a474 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploader.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploader.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.etlserver.proteomics;
 import java.io.File;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.List;
 import java.util.Properties;
 
 import javax.sql.DataSource;
@@ -26,7 +27,6 @@ import javax.sql.DataSource;
 import org.apache.log4j.Logger;
 
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.properties.PropertyUtils;
@@ -35,6 +35,8 @@ import ch.systemsx.cisd.etlserver.IDataSetUploader;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummary;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 
 /**
  * @author Franz-Josef Elmer
@@ -103,8 +105,20 @@ public class ProtXMLUploader implements IDataSetUploader
     @Override
     public void upload(File dataSet, DataSetInformation dataSetInformation)
     {
+        Experiment experiment = dataSetInformation.tryToGetExperiment();
+        if (experiment != null)
+        {
+            List<IEntityProperty> properties = experiment.getProperties();
+            for (IEntityProperty property : properties)
+            {
+                if (property.getPropertyType().getCode().equals(DataSetInfoExtractorForProteinResults.NOT_PROCESSED_PROPERTY))
+                {
+                    return;
+                }
+            }
+        }
         long time = System.currentTimeMillis();
-        File protXMLFile = getProtXMLFile(dataSet);
+        File protXMLFile = Util.tryGetProtXMLFile(dataSet);
         ProteinSummary summary = loader.readProtXML(protXMLFile);
         if (operationLog.isInfoEnabled())
         {
@@ -132,7 +146,10 @@ public class ProtXMLUploader implements IDataSetUploader
     {
         try
         {
-            currentResultDataSetUploader.commit();
+            if (currentResultDataSetUploader != null)
+            {
+                currentResultDataSetUploader.commit();
+            }
         } finally
         {
             currentResultDataSetUploader = null;
@@ -169,20 +186,4 @@ public class ProtXMLUploader implements IDataSetUploader
                 msInjectionSampleDelimiter, restrictedSampleResolving);
     }
 
-    private File getProtXMLFile(File dataSet)
-    {
-        if (dataSet.isDirectory() == false)
-        {
-            return dataSet;
-        }
-        File[] files = dataSet.listFiles();
-        for (File file : files)
-        {
-            if (file.getName().endsWith("prot.xml"))
-            {
-                return file;
-            }
-        }
-        throw new UserFailureException("No *prot.xml file found in data set '" + dataSet + "'.");
-    }
 }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Util.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Util.java
index 85bd6a5709d..44cb45261ee 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Util.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/Util.java
@@ -39,6 +39,28 @@ class Util
     private Util()
     {
     }
+    
+    /**
+     * Tries to return the prot.xml file in the specified data set.
+     * 
+     * @return <code>null</code> if non found.
+     */
+    static File tryGetProtXMLFile(File dataSet)
+    {
+        if (dataSet.isDirectory() == false)
+        {
+            return dataSet;
+        }
+        File[] files = dataSet.listFiles();
+        for (File file : files)
+        {
+            if (file.getName().endsWith("prot.xml"))
+            {
+                return file;
+            }
+        }
+        return null;
+    }
 
     /**
      * Returns an array of all entity properties defined by the specified entity type for which
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java
index 376b995fa47..15b9ceb78cb 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java
@@ -25,6 +25,8 @@ import static ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractor
 import java.io.File;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
 
 import org.hamcrest.BaseMatcher;
@@ -39,15 +41,15 @@ import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
+import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
-import ch.systemsx.cisd.openbis.etlserver.proteomics.DataSetInfoExtractorForProteinResults;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
@@ -71,6 +73,8 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
 
     private File dataSet;
 
+    private File protXmlFile;
+
     @BeforeMethod
     public void beforeMethod()
     {
@@ -78,6 +82,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
         service = context.mock(IEncapsulatedOpenBISService.class);
         dataSet = new File(workingDirectory, "space1&project1");
         dataSet.mkdirs();
+        protXmlFile = new File(dataSet, "prot.xml");
     }
 
     @AfterMethod
@@ -91,6 +96,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
     @Test
     public void testWithNonDefaultExperimentTypeAndPropertiesFileName()
     {
+        FileUtilities.writeToFile(protXmlFile, "");
         String propertiesFile = "my.properties";
         FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n"
                 + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP_TO_BE_IGNORED\n"
@@ -123,6 +129,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
     @Test
     public void testWithProvidedExperimentCode()
     {
+        FileUtilities.writeToFile(protXmlFile, "");
         String propertiesFile = "my.properties";
         FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n"
                 + DataSetInfoExtractorForProteinResults.EXPERIMENT_CODE_KEY + "= MY_EXP1\n");
@@ -132,11 +139,11 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
         properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile);
         prepare(experimentType, false);
         context.checking(new Expectations()
-        {
             {
-                one(service).registerExperiment(with(any(NewExperiment.class)));
-            }
-        });
+                {
+                    one(service).registerExperiment(with(any(NewExperiment.class)));
+                }
+            });
         
         IDataSetInfoExtractor extractor = createExtractor(properties);
         
@@ -149,6 +156,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
     @Test
     public void testRegistrationWithOneMandatoryProperty()
     {
+        FileUtilities.writeToFile(protXmlFile, "");
         FileUtilities.writeToFile(new File(dataSet,
                 DataSetInfoExtractorForProteinResults.DEFAULT_EXPERIMENT_PROPERTIES_FILE_NAME),
                 "answer=42\nblabla=blub\n" + PARENT_DATA_SET_CODES + "=1 2  3   4\n");
@@ -198,7 +206,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
     }
 
     @Test
-    public void testRegistrationWithMissingMandatoryProperty()
+    public void testRegistrationWithMissingProtXmlFile()
     {
         prepare(DEFAULT_EXPERIMENT_TYPE_CODE);
 
@@ -209,15 +217,35 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
             fail("UserFailureException expected");
         } catch (UserFailureException ex)
         {
-            assertEquals("The following mandatory properties are missed: [answer]", ex.getMessage());
+            assertEquals("No *prot.xml file found in data set '" + dataSet + "'.", ex.getMessage());
         }
 
         context.assertIsSatisfied();
     }
-
+    
+    @Test
+    public void testRegistrationWithMissingMandatoryProperty()
+    {
+        FileUtilities.writeToFile(protXmlFile, "");
+        prepare(DEFAULT_EXPERIMENT_TYPE_CODE);
+        
+        IDataSetInfoExtractor extractor = createExtractor(new Properties());
+        try
+        {
+            extractor.getDataSetInformation(dataSet, service);
+            fail("UserFailureException expected");
+        } catch (UserFailureException ex)
+        {
+            assertEquals("The following mandatory properties are missed: [answer]", ex.getMessage());
+        }
+        
+        context.assertIsSatisfied();
+    }
+    
     @Test
-    public void testWithParentDataSetsDefinedByBaseExperiment()
+    public void testWithParentDataSetsDefinedByBaseExperimentAndProtXmlFileTooLarge()
     {
+        FileUtilities.writeToFile(protXmlFile, "abc");
         String propertiesFile = "my.properties";
         FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n"
                 + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP1\n");
@@ -225,7 +253,9 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
         String experimentType = "MY_EXPERIMENT";
         properties.setProperty(EXPERIMENT_TYPE_CODE_KEY, experimentType);
         properties.setProperty(EXPERIMENT_PROPERTIES_FILE_NAME_KEY, propertiesFile);
+        properties.setProperty(DataSetInfoExtractorForProteinResults.PROT_XML_SIZE_THRESHOLD, "0");
         prepare(experimentType);
+        final RecordingMatcher<NewExperiment> experimentMatcher = new RecordingMatcher<NewExperiment>();
         context.checking(new Expectations()
             {
                 {
@@ -240,7 +270,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
                     AbstractExternalData ds2 = new DataSetBuilder().code("ds2").getDataSet();
                     will(returnValue(Arrays.asList(ds1, ds2)));
 
-                    one(service).registerExperiment(with(any(NewExperiment.class)));
+                    one(service).registerExperiment(with(experimentMatcher));
                 }
             });
 
@@ -250,12 +280,16 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
 
         assertEquals("/SPACE1/PROJECT1/E4711", info.getExperimentIdentifier().toString());
         assertEquals("[ds1, ds2]", info.getParentDataSetCodes().toString());
+        IEntityProperty[] expProps = experimentMatcher.recordedObject().getProperties();
+        assertEquals("Size of prot.xml file prot.xml is with 3 bytes too large. Maximum size is 0 bytes",
+                asMap(expProps).get(DataSetInfoExtractorForProteinResults.NOT_PROCESSED_PROPERTY).getValue());
         context.assertIsSatisfied();
     }
 
     @Test
     public void testWithUnkownBaseExperiment()
     {
+        FileUtilities.writeToFile(protXmlFile, "");
         String propertiesFile = "my.properties";
         FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n"
                 + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP1\n");
@@ -291,6 +325,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
     @Test
     public void testWithUnkownParentDataSets()
     {
+        FileUtilities.writeToFile(protXmlFile, "");
         String propertiesFile = "my.properties";
         FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n"
                 + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP1\n" + PARENT_DATA_SET_CODES_KEY
@@ -320,6 +355,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
     @Test
     public void testWithParentDataSetsSeparatedBySpaces()
     {
+        FileUtilities.writeToFile(protXmlFile, "");
         String propertiesFile = "my.properties";
         FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n"
                 + EXPERIMENT_IDENTIFIER_KEY + "= /TEST/PROJECT/EXP1\n" + PARENT_DATA_SET_CODES_KEY
@@ -350,6 +386,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
     @Test
     public void testWithParentDataSetsSeparatedByComma()
     {
+        FileUtilities.writeToFile(protXmlFile, "");
         String propertiesFile = "my.properties";
         FileUtilities.writeToFile(new File(dataSet, propertiesFile), "answer=42\nblabla=blub\n"
                 + PARENT_DATA_SET_CODES_KEY + " = ds1,ds2");
@@ -394,12 +431,16 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
 
                     one(service).getExperimentType(experimentType);
                     ExperimentType type = new ExperimentType();
-                    ExperimentTypePropertyType etpt = new ExperimentTypePropertyType();
-                    PropertyType propertyType = new PropertyType();
-                    propertyType.setCode("answer");
-                    etpt.setPropertyType(propertyType);
-                    etpt.setMandatory(true);
-                    type.setExperimentTypePropertyTypes(Arrays.asList(etpt));
+                    ExperimentTypePropertyType etpt1 = new ExperimentTypePropertyType();
+                    PropertyType propertyType1 = new PropertyType();
+                    propertyType1.setCode("answer");
+                    etpt1.setPropertyType(propertyType1);
+                    etpt1.setMandatory(true);
+                    ExperimentTypePropertyType etpt2 = new ExperimentTypePropertyType();
+                    PropertyType propertyType2 = new PropertyType();
+                    propertyType2.setCode(DataSetInfoExtractorForProteinResults.NOT_PROCESSED_PROPERTY);
+                    etpt2.setPropertyType(propertyType2);
+                    type.setExperimentTypePropertyTypes(Arrays.asList(etpt1, etpt2));
                     will(returnValue(type));
                 }
             });
@@ -420,6 +461,16 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
                 }
             });
     }
+    
+    private Map<String, IEntityProperty> asMap(IEntityProperty[] properties)
+    {
+        Map<String, IEntityProperty> result = new HashMap<String, IEntityProperty>();
+        for (IEntityProperty property : properties)
+        {
+            result.put(property.getPropertyType().getCode(), property);
+        }
+        return result;
+    }
 
     private IDataSetInfoExtractor createExtractor(Properties properties)
     {
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploaderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploaderTest.java
index 5c4912e98d1..cfcfd3bacb2 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploaderTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProtXMLUploaderTest.java
@@ -24,14 +24,12 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
-import ch.systemsx.cisd.openbis.etlserver.proteomics.ProtXMLUploader;
-import ch.systemsx.cisd.openbis.etlserver.proteomics.ResultDataSetUploader;
 import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummary;
 import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ProteinSummaryHeader;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder;
 
 /**
  * 
@@ -137,25 +135,18 @@ public class ProtXMLUploaderTest extends ProtXMLTestCase
     }
     
     @Test
-    public void testDataSetIsFolderWithoutProtXMLFile()
+    public void testDataSetIsFolderWithProtXMLFileToBeTooLarge()
     {
         File dataSet = new File(workingDirectory, "data-set");
         dataSet.mkdir();
-        FileUtilities.writeToFile(new File(dataSet, "pep.xml"), "peptides");
+        FileUtilities.writeToFile(new File(dataSet, "test-prot.xml"), EXAMPLE);
         DataSetInformation dataSetInformation = new DataSetInformation();
+        dataSetInformation.setExperiment(new ExperimentBuilder().property(
+                DataSetInfoExtractorForProteinResults.NOT_PROCESSED_PROPERTY, "too large").getExperiment());
         
-        try
-        {
-            uploader.upload(dataSet, dataSetInformation);
-            fail("UserFailureException expected");
-        } catch (UserFailureException ex)
-        {
-            assertEquals(
-                    "No *prot.xml file found in data set "
-                            + "'targets/unit-test-wd/ch.systemsx.cisd.openbis.etlserver.proteomics.ProtXMLUploaderTest/data-set'.",
-                    ex.getMessage());
-        }
+        uploader.upload(dataSet, dataSetInformation);
         
+        assertEquals(null, uploader.getDataSetInformation());
         context.assertIsSatisfied();
     }
 }
-- 
GitLab