From 231d9586d1f0a957605182d77d95a0b698f15d39 Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Mon, 3 Jun 2013 12:56:05 +0000
Subject: [PATCH] CCS-35 SP-627 : Refactoring yeastlab mobile service to move
 code to Java

SVN: 29267
---
 .../ipad-read-service-v1/ipad_read.py         |  52 +++++-------------
 .../lib/ipad-framework.jar                    | Bin 34796 -> 18031 bytes
 .../ipad/v2/server/IpadServiceUtilities.java  |  27 +++++++++
 .../openbis/ipad/v2/server/SamplesByType.java |  49 +++++++++++++++++
 4 files changed, 89 insertions(+), 39 deletions(-)
 create mode 100644 openbis-ipad/source/java/ch/systemsx/cisd/openbis/ipad/v2/server/SamplesByType.java

diff --git a/openbis-ipad/source/core-plugins/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py b/openbis-ipad/source/core-plugins/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py
index fd0f0d9dc17..032113196ac 100644
--- a/openbis-ipad/source/core-plugins/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py
+++ b/openbis-ipad/source/core-plugins/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py
@@ -122,45 +122,19 @@ class RequestHandler(IRequestHandler):
 		self.add_data_rows()
 
 	def sort_samples_by_type(self, allSamples):
-
-		self.oligos = []
-		self.antibodies = []
-		self.chemicals = []
-		self.protocols = []
-		self.medias = []
-		self.pcrs = []
-		self.buffers = []
-		self.plasmids = []
-		self.yeasts = []
-		self.bacterias = []
-		self.enzymes = []
-		self.westernBlottings = []
-
-		for sample in allSamples:
-			if 'OLIGO' == sample.getSampleType():
-				self.oligos.append(sample)
-			elif 'ANTIBODY' == sample.getSampleType():
-				self.antibodies.append(sample)
-			elif 'CHEMICAL' == sample.getSampleType():
-				self.chemicals.append(sample)
-			elif 'GENERAL_PROTOCOL' == sample.getSampleType():
-				self.protocols.append(sample)
-			elif 'MEDIA' == sample.getSampleType():
-				self.medias.append(sample)
-			elif 'PCR' == sample.getSampleType():
-				self.pcrs.append(sample)
-			elif 'SOLUTIONS_BUFFERS' == sample.getSampleType():
-				self.buffers.append(sample)
-			elif 'PLASMID' == sample.getSampleType():
-				self.plasmids.append(sample)
-			elif 'YEAST' == sample.getSampleType():
-				self.yeasts.append(sample)
-			elif 'BACTERIA' == sample.getSampleType():
-				self.bacterias.append(sample)
-			elif 'ENZYME' == sample.getSampleType():
-				self.enzymes.append(sample)
-			elif 'WESTERN_BLOTTING' == sample.getSampleType():
-				self.westernBlottings.append(sample)
+		samplesByType = IpadServiceUtilities.groupSamplesByType(allSamples)
+		self.oligos = samplesByType.getSamples('OLIGO')
+		self.antibodies = samplesByType.getSamples('ANTIBODY')
+		self.chemicals = samplesByType.getSamples('CHEMICAL')
+		self.protocols = samplesByType.getSamples('GENERAL_PROTOCOL')
+		self.medias = samplesByType.getSamples('MEDIA')
+		self.pcrs = samplesByType.getSamples('PCR')
+		self.buffers = samplesByType.getSamples('SOLUTIONS_BUFFERS')
+		self.plasmids = samplesByType.getSamples('PLASMID')
+		self.yeasts = samplesByType.getSamples('YEAST')
+		self.bacterias = samplesByType.getSamples('BACTERIA')
+		self.enzymes = samplesByType.getSamples('ENZYME')
+		self.westernBlottings = samplesByType.getSamples('WESTERN_BLOTTING')
 
 	def processRequest(self):
 		self.process_request()
diff --git a/openbis-ipad/source/core-plugins/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/lib/ipad-framework.jar b/openbis-ipad/source/core-plugins/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/lib/ipad-framework.jar
index 6d1202283a8a4d4ace2bf876be1ac6491bb0f53c..6fbce3d86bb352986f3bb06e940aaad1e3fc9c23 100644
GIT binary patch
literal 18031
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

literal 34796
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
NLV5*vZBOvi{{hG-y>kEn

diff --git a/openbis-ipad/source/java/ch/systemsx/cisd/openbis/ipad/v2/server/IpadServiceUtilities.java b/openbis-ipad/source/java/ch/systemsx/cisd/openbis/ipad/v2/server/IpadServiceUtilities.java
index 1ecad923eb2..e161800dbb9 100644
--- a/openbis-ipad/source/java/ch/systemsx/cisd/openbis/ipad/v2/server/IpadServiceUtilities.java
+++ b/openbis-ipad/source/java/ch/systemsx/cisd/openbis/ipad/v2/server/IpadServiceUtilities.java
@@ -17,10 +17,13 @@
 package ch.systemsx.cisd.openbis.ipad.v2.server;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
 
 import com.fasterxml.jackson.core.JsonGenerationException;
 import com.fasterxml.jackson.databind.JsonMappingException;
@@ -78,4 +81,28 @@ public class IpadServiceUtilities
         return null;
     }
 
+    /**
+     * Group a collection of samples into groups by type.
+     * 
+     * @return An object that provides access to the samples for a particular type.
+     */
+    public static SamplesByType groupSamplesByType(List<ISampleImmutable> allSamples)
+    {
+        HashMap<String, List<ISampleImmutable>> samplesByType = new HashMap<String, List<ISampleImmutable>>();
+        for (ISampleImmutable sample : allSamples)
+        {
+            String sampleType = sample.getSampleType();
+            List<ISampleImmutable> samples = samplesByType.get(sampleType);
+            if (null == samples)
+            {
+                samples = new ArrayList<ISampleImmutable>();
+                samples.add(sample);
+                samplesByType.put(sampleType, samples);
+            } else
+            {
+                samples.add(sample);
+            }
+        }
+        return new SamplesByType(samplesByType);
+    }
 }
diff --git a/openbis-ipad/source/java/ch/systemsx/cisd/openbis/ipad/v2/server/SamplesByType.java b/openbis-ipad/source/java/ch/systemsx/cisd/openbis/ipad/v2/server/SamplesByType.java
new file mode 100644
index 00000000000..1d4a282506a
--- /dev/null
+++ b/openbis-ipad/source/java/ch/systemsx/cisd/openbis/ipad/v2/server/SamplesByType.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2013 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.openbis.ipad.v2.server;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
+
+/**
+ * Represents a collection of samples grouped by type.
+ * 
+ * @author cramakri
+ */
+public class SamplesByType
+{
+    private final Map<String, List<ISampleImmutable>> samplesByType;
+
+    public SamplesByType(Map<String, List<ISampleImmutable>> samplesByType)
+    {
+        this.samplesByType = samplesByType;
+    }
+
+    public List<ISampleImmutable> getSamples(String sampleType)
+    {
+        List<ISampleImmutable> samples = samplesByType.get(sampleType);
+        if (null == samples)
+        {
+            samples = new ArrayList<ISampleImmutable>();
+        }
+        return samples;
+    }
+
+}
-- 
GitLab