From edebe33609eeadca09c97997dbc8f6b587f48a91 Mon Sep 17 00:00:00 2001
From: kohleman <kohleman>
Date: Wed, 7 Sep 2016 15:16:43 +0000
Subject: [PATCH] - added rsync parameter fields - allow tracking of samples
 without sending an email (new flag in command line)

SVN: 37038
---
 .../cisd/dsu/tracking/main/Parameters.java    | 20 ++++++
 .../cisd/dsu/tracking/main/TrackingBO.java    | 71 +++++++++----------
 .../dsu/tracking/main/TrackingClient.java     | 25 +++++++
 .../cisd/dsu/tracking/utils/LogUtils.java     |  2 +-
 4 files changed, 81 insertions(+), 37 deletions(-)

diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java
index 188e8d55d98..562fd244815 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java
@@ -55,6 +55,10 @@ public class Parameters
 
     private static final String DESTINATION_FOLDER = "destination-folder";
     
+    private static final String RSYNC_BINARY = "rsync-binary";
+
+    private static final String RSYNC_FLAGS = "rsync-flags";
+    
     private final String openbisUser;
 
     private final String openbisPassword;
@@ -80,6 +84,10 @@ public class Parameters
     private final String dataSetTypeList;
     
     private final String destinationFolder;
+    
+    private final String rsyncBinary;
+    
+    private final String rsyncFlags;
 
     public Parameters(Properties props)
     {
@@ -96,6 +104,8 @@ public class Parameters
         this.oldDataSetBacklogNumber = PropertyUtils.getInt(props, OLD_DATA_SET_BACKLOG_NUMBER, 0);
         this.dataSetTypeList = PropertyUtils.getProperty(props, DATA_SET_TYPE_LIST);
         this.destinationFolder= PropertyUtils.getProperty(props, DESTINATION_FOLDER);
+        this.rsyncBinary = PropertyUtils.getProperty(props, RSYNC_BINARY);
+        this.rsyncFlags = PropertyUtils.getProperty(props, RSYNC_FLAGS);
     }
 
     public String getOpenbisUser()
@@ -162,4 +172,14 @@ public class Parameters
     {
     	return destinationFolder;
     }
+    
+    public String getRsyncBinary()
+    {
+    	return rsyncBinary;
+    }
+    
+    public String getRsyncFlags()
+    {
+    	return rsyncFlags;
+    }
 }
\ No newline at end of file
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
index aae72a17996..a958dfcd367 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
@@ -96,9 +96,19 @@ public class TrackingBO
         
         if (commandLineMap.get(TrackingClient.CL_PARAMETER_LANES) != null)
         {
+        	String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_LANES);
             changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params,
-                    commandLineMap.get(TrackingClient.CL_PARAMETER_LANES), session);
+                    commandLineMap, laneCodeList, session);
+        }
+        
+        else if (commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES) != null)
+        {
+            sendEmails = false;
+        	String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES);
+        	changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params,
+                    commandLineMap, laneCodeList, session);
         } 
+
         
         else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_ALL))
         {
@@ -106,7 +116,7 @@ public class TrackingBO
             System.out.println("This function is deactivated");
         }
         
-        // just list the potential chnaged lanes
+        // just list the potential changed lanes
         else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_CHANGED_LANES))
         {
             Map<String, String> changed_lanes = fetchChangedLanes(prevTrackingState, trackingServer, params, session);
@@ -282,24 +292,6 @@ public class TrackingBO
             }
         }
         
-        
-        
-//    	Properties properties = new Properties();        	
-//    	File storeRoot = null;
-//
-//    	DataSetCopier dsc = new DataSetCopier(properties, storeRoot);
-//		dsc.process(description, context);
-
-//    	PhysicalDataSet pds = d.tryGetAsDataSet();
-//    	
-//    	DataSetProcessingContext context = null;
-//    	
-//    	DatasetDescription description = new DatasetDescription();
-//        description.setDataSetCode(d.getCode());
-//        description.setDatasetTypeCode(d.getDataSetType().getCode());
-//        description.setDataSetLocation(d.tryGetAsDataSet().getDataSetLocation());
-        
-        
         Set<Map.Entry<String, String>> entrySet = changedLanesMap.entrySet();
         for (Entry<String, String> entry : entrySet)
         {
@@ -311,9 +303,11 @@ public class TrackingBO
     }
 
     private static TrackedEntities fetchChangedDataSets(TrackingStateDTO trackingState,
-            ITrackingServer trackingServer,  Parameters params, String[] laneCodeList, SessionContextDTO session)
+            ITrackingServer trackingServer,  Parameters params, final HashMap<String, String[]> commandLineMap,
+            String[] laneCodeList, SessionContextDTO session)
     {
     	long usableDataSetId = getUsableDataSetId(trackingState, params);
+    	
         List<String> spaceWhiteList = Arrays.asList(params.getSpaceWhitelist().split("\\s*,\\s*"));
         List<String> datasetTypeList = Arrays.asList(params.getdataSetTypeList().split("\\s*,\\s*"));
        
@@ -361,29 +355,34 @@ public class TrackingBO
                 		}
                 	}
                 }
-                System.out.println("Sending Email for " + newDataSetID + " which is part of " + d.getSampleCode());
+//                System.out.println("Sending Email for Data Set with permID " + d.getPermId() + " which is part of " + d.getSampleCode());
                 addDataSetTo(changedTrackingMap, d);
         }
         
-        LogUtils.info("TO_TRANSFER: Found " + toTransferDataSets.size() + " data sets which are to be transferred to an extra folder");
-        
-
-        
-        //TODO: extract and make robust       
-        File rsyncBinary = new File("/opt/local/bin/rsync");
-        File destination = new File(params.getDestinationFolder());
-        RsyncCopier copier = new RsyncCopier(rsyncBinary, null, "-a");
+        LogUtils.info("TO_TRANSFER: Found " + toTransferDataSets.size() + " data sets which could be transferred to an extra folder");
+       
         
-        for (AbstractExternalData ds : dataSets) {
-        	File source = new File(ds.tryGetAsDataSet().getFullLocation());
-        	copier.copy(source, destination, null, null);
-        	LogUtils.info("Copying " + ds.getCode() + " to " + params.getDestinationFolder());
-        	
+        if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_COPY_DATA_SETS))
+        {
+            extraDataSetCopy(params, toTransferDataSets);
         }
 
         LogUtils.info("Found " + filteredDataSets.size() + " data sets which are connected to samples in " + filterList.toString());
         return gatherTrackedEntities(trackingState, trackingServer, session, filteredDataSets, changedTrackingMap);
     }
+    
+        
+	private static void extraDataSetCopy(Parameters params, List<AbstractExternalData> dataSets) {
+		File rsyncBinary = new File(params.getRsyncBinary());
+		File destination = new File(params.getDestinationFolder());
+		RsyncCopier copier = new RsyncCopier(rsyncBinary, null, params.getRsyncFlags());
+		
+		for (AbstractExternalData ds : dataSets) {
+			File source = new File(ds.tryGetAsDataSet().getFullLocation());
+			copier.copy(source, destination, null, null);
+			LogUtils.info("Copying " + ds.getCode() + " from " + source + " to " + params.getDestinationFolder());            	
+		}
+	}
 
     private static long getMaxDataSetId(TrackingStateDTO trackingState)
     {
@@ -440,7 +439,7 @@ public class TrackingBO
         Sample currentLane = dataSet.getSample();
         String lanePermId = currentLane.getPermId();
 
-        LogUtils.info("Found lane with permId: " + lanePermId + " with new DS techId " + dataSet.getId() + " and DS permId " + dataSet.getPermId());
+        LogUtils.info("Found lane " + currentLane.getCode() + " with permId: " + lanePermId + " with new DS techId " + dataSet.getId() + " and DS permId " + dataSet.getPermId());
         ArrayList<Long> existingList = changedTrackingMap.get(lanePermId);
         if (existingList == null)
         {
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java
index c7a246076ef..617b7a897cc 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java
@@ -71,6 +71,10 @@ public class TrackingClient
 
     public static final String CL_PARAMETER_CHANGED_LANES = "changed_lanes";
 
+    public static final String CL_PARAMETER_COPY_DATA_SETS = "copy_data_sets";
+    
+    public static final String CL_PARAMETER_REMOVE_LANES = "remove";
+
     public static void main(String[] args)
     {
         try
@@ -98,11 +102,22 @@ public class TrackingClient
                 .create(CL_PARAMETER_LANES);
         lanes.setArgs(Option.UNLIMITED_VALUES);
         // Option all = new Option(CL_PARAMETER_ALL, "track all lanes, only for testing, never use in production!");
+        
         Option new_lanes = new Option(CL_PARAMETER_CHANGED_LANES, "only list lanes which have new datasets");
+        
+        Option copy_data_sets = new Option(CL_PARAMETER_COPY_DATA_SETS, "also copy the corresponding data sets to an extra"
+        		+ " folder. Only in combination with parameter \"" + CL_PARAMETER_LANES + "\"");
+        
+        Option remove = OptionBuilder.withArgName(CL_PARAMETER_REMOVE_LANES)
+        		.hasArg()
+        		.withDescription("remove lanes from tracking list and do not send an email")
+        		.create(CL_PARAMETER_REMOVE_LANES);
 
         options.addOption(lanes);
         // options.addOption(all);
         options.addOption(new_lanes);
+        options.addOption(copy_data_sets);
+        options.addOption(remove);
 
         // automatically generate the help statement
         HelpFormatter formatter = new HelpFormatter();
@@ -130,9 +145,19 @@ public class TrackingClient
             {
                 commandLineMap.put(CL_PARAMETER_CHANGED_LANES, null);
             }
+            if (line.hasOption(CL_PARAMETER_COPY_DATA_SETS))
+            {
+            	commandLineMap.put(CL_PARAMETER_COPY_DATA_SETS, null);
+            }
+            if (line.hasOption(CL_PARAMETER_REMOVE_LANES))
+            {
+                commandLineMap.put(CL_PARAMETER_REMOVE_LANES, line.getOptionValues(CL_PARAMETER_REMOVE_LANES));
+            }
         } catch (ParseException exp)
         {
             LogUtils.environmentError("Parsing of command line parameters failed.", exp.getMessage());
+            System.out.println("Parsing of command line parameters failed. " + exp.getMessage());
+            System.exit(1);
         }
         return commandLineMap;
     }
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java
index 1e123289452..1121a7d570c 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java
@@ -47,7 +47,7 @@ public class LogUtils
     public static void notify(Throwable ex)
     {
         String fullMsg =
-                "An unexpected exception occured why trying to send emails with changes.\n"
+                "An unexpected exception occured while trying to send emails with changes.\n"
                         + "Error details: " + ex.getMessage();
         notify(ex, fullMsg);
     }
-- 
GitLab