From 04af97ce18e4886084f1f74b97a21f8e1d0c2dae Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Thu, 25 Nov 2010 08:02:52 +0000 Subject: [PATCH] SE-316 MsInjectionDataSetCopier renamed to DataSetCopier. New feature: Optional creation of marker file. SVN: 18892 --- rtd_phosphonetx/etc/service.properties | 7 ++- ...nDataSetCopier.java => DataSetCopier.java} | 8 +-- ...nCopier.java => LocalAndRemoteCopier.java} | 61 ++++++++++++++++++- ...est.java => LocalAndRemoteCopierTest.java} | 28 +++++---- 4 files changed, 83 insertions(+), 21 deletions(-) rename rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/{MsInjectionDataSetCopier.java => DataSetCopier.java} (81%) rename rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/{MsInjectionCopier.java => LocalAndRemoteCopier.java} (82%) rename rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/{MsInjectionCopierTest.java => LocalAndRemoteCopierTest.java} (89%) diff --git a/rtd_phosphonetx/etc/service.properties b/rtd_phosphonetx/etc/service.properties index ae268dcd0a2..e77226919e3 100644 --- a/rtd_phosphonetx/etc/service.properties +++ b/rtd_phosphonetx/etc/service.properties @@ -131,8 +131,9 @@ copy-data-sets.class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.stand copy-data-sets.destination = vesuvio:tmp/${user} ms-inj-copy.label = MS INJECTION Data Set Copier -ms-inj-copy.dataset-types = - -ms-inj-copy.class = ch.systemsx.cisd.openbis.dss.phosphonetx.server.plugins.MsInjectionDataSetCopier +ms-inj-copy.dataset-types = UNKNOWN, RAW_DATA,MZXML_DATA,PROT_RESULT +ms-inj-copy.class = ch.systemsx.cisd.openbis.dss.phosphonetx.server.plugins.DataSetCopier +ms-inj-copy.marker-file-prefix = .MARKER_finished_ #ms-inj-copy.destination = /Volumes/share-1-\$/user/cisd/felmer/phosphonetx/ ms-inj-copy.destination = vesuvio:tmp @@ -185,7 +186,7 @@ prot-result.incoming-data-completeness-condition = auto-detection # ---------------- Plugin properties # The extractor class to use for code extraction -prot-result.data-set-info-extractor = ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForSearchExperiment +prot-result.data-set-info-extractor = ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForProteinResults prot-result.data-set-info-extractor.separator = + # The extractor class to use for type extraction prot-result.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionDataSetCopier.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/DataSetCopier.java similarity index 81% rename from rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionDataSetCopier.java rename to rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/DataSetCopier.java index b89716caebf..6b952e069da 100644 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionDataSetCopier.java +++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/DataSetCopier.java @@ -31,19 +31,19 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.SshCommandEx * * @author Franz-Josef Elmer */ -public class MsInjectionDataSetCopier extends AbstractDropboxProcessingPlugin +public class DataSetCopier extends AbstractDropboxProcessingPlugin { private static final long serialVersionUID = 1L; - public MsInjectionDataSetCopier(Properties properties, File storeRoot) + public DataSetCopier(Properties properties, File storeRoot) { this(properties, storeRoot, new RsyncCopierFactory(), new SshCommandExecutorFactory()); } - @Private MsInjectionDataSetCopier(Properties properties, File storeRoot, IPathCopierFactory pathCopierFactory, + @Private DataSetCopier(Properties properties, File storeRoot, IPathCopierFactory pathCopierFactory, ISshCommandExecutorFactory sshCommandExecutorFactory) { - super(properties, storeRoot, new MsInjectionCopier(properties, pathCopierFactory, + super(properties, storeRoot, new LocalAndRemoteCopier(properties, pathCopierFactory, sshCommandExecutorFactory)); } } diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionCopier.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/LocalAndRemoteCopier.java similarity index 82% rename from rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionCopier.java rename to rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/LocalAndRemoteCopier.java index 14e0627f6bb..2ed79d33074 100644 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionCopier.java +++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/LocalAndRemoteCopier.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.dss.phosphonetx.server.plugins; import java.io.File; +import java.io.IOException; import java.io.Serializable; import java.util.List; import java.util.Map; @@ -25,6 +26,7 @@ import java.util.Properties; import org.apache.log4j.Logger; import ch.rinn.restrictions.Private; +import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.filesystem.BooleanStatus; import ch.systemsx.cisd.common.filesystem.FileOperations; @@ -49,9 +51,11 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; /** * @author Franz-Josef Elmer */ -class MsInjectionCopier implements Serializable, IPostRegistrationDatasetHandler +class LocalAndRemoteCopier implements Serializable, IPostRegistrationDatasetHandler { + @Private static final String MARKER_FILE_PREFIX = "marker-file-prefix"; + @Private static final String SAMPLE_UNKNOWN = "sample-unknown"; @@ -87,6 +91,8 @@ class MsInjectionCopier implements Serializable, IPostRegistrationDatasetHandler void copyDataSet(File dataSet, File destination); void renameTo(File newFile, File oldFile); + + void createMarkerFile(File markerFile); } private static final class LocalExcecutor implements IExecutor @@ -144,6 +150,22 @@ class MsInjectionCopier implements Serializable, IPostRegistrationDatasetHandler } } + public void createMarkerFile(File markerFile) + { + try + { + boolean result = markerFile.createNewFile(); + if (result == false) + { + throw new IOException("File '" + markerFile + "' already exists."); + } + } catch (IOException ex) + { + operationLog.error("Couldn't create marker file '" + markerFile + "'.", ex); + throw new ExceptionWithStatus(Status.createError("creating a marker file failed"), ex); + } + } + } private static final class RemoteExecutor implements IExecutor @@ -226,12 +248,34 @@ class MsInjectionCopier implements Serializable, IPostRegistrationDatasetHandler throw new ExceptionWithStatus(Status.createError("moving leads to a problem")); } } + + public void createMarkerFile(File markerFile) + { + ProcessResult result = + executor.executeCommandRemotely( + "touch " + markerFile.getPath(), + DataSetCopier.SSH_TIMEOUT_MILLIS); + if (result.isOK() == false) + { + operationLog.error("Creation of marker file '" + markerFile + + "' failed with exit value: " + result.getExitValue()); + throw new ExceptionWithStatus(Status.createError("creating a marker file failed")); + } + List<String> output = result.getOutput(); + if (output.isEmpty() == false) + { + operationLog.error("Creation of marker file '" + markerFile + + "' seemed to be successful but produced following output:\n" + + StringUtilities.concatenateWithNewLine(output)); + throw new ExceptionWithStatus(Status.createError("creating a marker file leads to a problem")); + } + } } private static final long serialVersionUID = 1L; private final static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - MsInjectionCopier.class); + LocalAndRemoteCopier.class); private final Properties properties; @@ -243,12 +287,19 @@ class MsInjectionCopier implements Serializable, IPostRegistrationDatasetHandler private transient File destination; - MsInjectionCopier(Properties properties, IPathCopierFactory pathCopierFactory, + private String markerFilePrefix; + + LocalAndRemoteCopier(Properties properties, IPathCopierFactory pathCopierFactory, ISshCommandExecutorFactory sshCommandExecutorFactory) { this.properties = properties; this.pathCopierFactory = pathCopierFactory; this.sshCommandExecutorFactory = sshCommandExecutorFactory; + markerFilePrefix = properties.getProperty(MARKER_FILE_PREFIX); + if (markerFilePrefix != null && markerFilePrefix.length() == 0) + { + throw new ConfigurationFailureException("marker-file-prefix is an empty string."); + } init(); } @@ -303,6 +354,10 @@ class MsInjectionCopier implements Serializable, IPostRegistrationDatasetHandler deleteTargetFolder(targetFolder); executor.copyDataSet(originalData, destination); executor.renameTo(targetFolder, new File(destination, originalData.getName())); + if (markerFilePrefix != null) + { + executor.createMarkerFile(new File(destination, markerFilePrefix + target)); + } return Status.OK; } catch (ExceptionWithStatus ex) diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionCopierTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/LocalAndRemoteCopierTest.java similarity index 89% rename from rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionCopierTest.java rename to rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/LocalAndRemoteCopierTest.java index 02e084c501c..da4303bf4e5 100644 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/MsInjectionCopierTest.java +++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/dss/phosphonetx/server/plugins/LocalAndRemoteCopierTest.java @@ -46,8 +46,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; /** * @author Franz-Josef Elmer */ -@Friend(toClasses = MsInjectionCopier.class) -public class MsInjectionCopierTest extends AbstractFileSystemTestCase +@Friend(toClasses = LocalAndRemoteCopier.class) +public class LocalAndRemoteCopierTest extends AbstractFileSystemTestCase { private static final ProcessResult OK_RESULT = new ProcessResult(Arrays.asList(""), 0, null, null, 0, null, null, null); @@ -115,8 +115,8 @@ public class MsInjectionCopierTest extends AbstractFileSystemTestCase { Properties properties = new Properties(); properties.setProperty(DataSetCopier.DESTINATION_KEY, destination.getPath()); - MsInjectionCopier msInjectionCopier = - new MsInjectionCopier(properties, copierFactory, sshExecutorFactory); + LocalAndRemoteCopier msInjectionCopier = + new LocalAndRemoteCopier(properties, copierFactory, sshExecutorFactory); prepareForCheckingLastModifiedDate(); DataSetInformation dataSetInformation = new DataSetInformation(); @@ -141,8 +141,8 @@ public class MsInjectionCopierTest extends AbstractFileSystemTestCase { Properties properties = new Properties(); properties.setProperty(DataSetCopier.DESTINATION_KEY, destination.getPath()); - MsInjectionCopier msInjectionCopier = - new MsInjectionCopier(properties, copierFactory, sshExecutorFactory); + LocalAndRemoteCopier msInjectionCopier = + new LocalAndRemoteCopier(properties, copierFactory, sshExecutorFactory); DataSetInformation dataSetInformation = new DataSetInformation(); dataSetInformation.setDataSetCode(DATA_SET_CODE); @@ -162,8 +162,8 @@ public class MsInjectionCopierTest extends AbstractFileSystemTestCase { Properties properties = new Properties(); properties.setProperty(DataSetCopier.DESTINATION_KEY, destination.getPath()); - MsInjectionCopier msInjectionCopier = - new MsInjectionCopier(properties, copierFactory, sshExecutorFactory); + LocalAndRemoteCopier msInjectionCopier = + new LocalAndRemoteCopier(properties, copierFactory, sshExecutorFactory); File copiedDataSet = new File(destination, FOLDER_NAME); copiedDataSet.mkdirs(); File dummy = new File(copiedDataSet, "dummy"); @@ -186,9 +186,10 @@ public class MsInjectionCopierTest extends AbstractFileSystemTestCase } @Test - public void testRemote() + public void testRemoteWithMarkerFile() { Properties properties = new Properties(); + properties.setProperty(LocalAndRemoteCopier.MARKER_FILE_PREFIX, "MARKER-"); properties.setProperty(DataSetCopier.DESTINATION_KEY, "localhost:" + destination.getPath()); properties.setProperty(DataSetCopier.RSYNC_EXEC + "-executable", rsyncExec.getPath()); properties.setProperty(DataSetCopier.SSH_EXEC + "-executable", sshExec.getPath()); @@ -221,10 +222,15 @@ public class MsInjectionCopierTest extends AbstractFileSystemTestCase "mv " + new File(destination, dataSet.getName()) + " " + copiedDataSet, SSH_TIMEOUT_MILLIS); will(returnValue(OK_RESULT)); + + one(sshExecutor).executeCommandRemotely( + "touch " + new File(destination, "MARKER-" + FOLDER_NAME), + SSH_TIMEOUT_MILLIS); + will(returnValue(OK_RESULT)); } }); - MsInjectionCopier msInjectionCopier = - new MsInjectionCopier(properties, copierFactory, sshExecutorFactory); + LocalAndRemoteCopier msInjectionCopier = + new LocalAndRemoteCopier(properties, copierFactory, sshExecutorFactory); DataSetInformation dataSetInformation = new DataSetInformation(); dataSetInformation.setDataSetCode(DATA_SET_CODE); -- GitLab