extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/servlet/LabelGenerationServlet.java

Code
Comments
Other
Rev Date Author Line
2964 20 Nov 14 olle 1 package net.sf.basedb.meludi.servlet;
2964 20 Nov 14 olle 2
5264 24 Jan 19 olle 3 import java.io.FileInputStream;
3575 05 Nov 15 olle 4 import java.io.FileWriter;
2964 20 Nov 14 olle 5 import java.io.IOException;
5264 24 Jan 19 olle 6 import java.io.InputStream;
5264 24 Jan 19 olle 7 import java.io.OutputStream;
5264 24 Jan 19 olle 8 import java.text.SimpleDateFormat;
5069 01 Nov 18 olle 9 import java.util.ArrayList;
3575 05 Nov 15 olle 10 import java.util.Date;
4131 26 Sep 16 olle 11 import java.util.HashMap;
5069 01 Nov 18 olle 12 import java.util.List;
4131 26 Sep 16 olle 13 import java.util.Set;
2964 20 Nov 14 olle 14
2964 20 Nov 14 olle 15 import javax.servlet.ServletException;
2964 20 Nov 14 olle 16 import javax.servlet.ServletOutputStream;
2964 20 Nov 14 olle 17 import javax.servlet.http.HttpServlet;
2964 20 Nov 14 olle 18 import javax.servlet.http.HttpServletRequest;
2964 20 Nov 14 olle 19 import javax.servlet.http.HttpServletResponse;
2964 20 Nov 14 olle 20
2964 20 Nov 14 olle 21 import net.sf.basedb.core.Application;
2964 20 Nov 14 olle 22 import net.sf.basedb.core.DbControl;
2964 20 Nov 14 olle 23 import net.sf.basedb.core.ItemQuery;
4131 26 Sep 16 olle 24 import net.sf.basedb.core.Project;
2964 20 Nov 14 olle 25 import net.sf.basedb.core.Sample;
2964 20 Nov 14 olle 26 import net.sf.basedb.core.SessionControl;
2964 20 Nov 14 olle 27 import net.sf.basedb.meludi.JsonUtil;
2964 20 Nov 14 olle 28 import net.sf.basedb.meludi.Meludi;
5264 24 Jan 19 olle 29 import net.sf.basedb.meludi.converter.DateToStringConverter;
5069 01 Nov 18 olle 30 import net.sf.basedb.meludi.dao.Annotationtype;
5069 01 Nov 18 olle 31 import net.sf.basedb.meludi.dao.FfpeBlock;
2964 20 Nov 14 olle 32 import net.sf.basedb.meludi.dao.Subtype;
3575 05 Nov 15 olle 33 import net.sf.basedb.util.Values;
2964 20 Nov 14 olle 34 import net.sf.basedb.util.error.ThrowableUtil;
2964 20 Nov 14 olle 35
5069 01 Nov 18 olle 36 import org.json.simple.JSONArray;
2964 20 Nov 14 olle 37 import org.json.simple.JSONObject;
5069 01 Nov 18 olle 38 import org.json.simple.parser.JSONParser;
2964 20 Nov 14 olle 39
2964 20 Nov 14 olle 40 public class LabelGenerationServlet 
2964 20 Nov 14 olle 41   extends HttpServlet
2964 20 Nov 14 olle 42 {  
2964 20 Nov 14 olle 43   private static final long serialVersionUID = 4343512283090513225L;
3575 05 Nov 15 olle 44   private static final String CASE_LABEL_INFO_FILENAME = "Case_Label_Info.csv";
5264 24 Jan 19 olle 45   private static int sitePrefixLength = 2;
2964 20 Nov 14 olle 46   
2964 20 Nov 14 olle 47   public LabelGenerationServlet()
2964 20 Nov 14 olle 48   {}
2964 20 Nov 14 olle 49   
2964 20 Nov 14 olle 50   @SuppressWarnings("unchecked")
2964 20 Nov 14 olle 51   @Override
2964 20 Nov 14 olle 52   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
2964 20 Nov 14 olle 53     throws ServletException, IOException 
2964 20 Nov 14 olle 54   {
2964 20 Nov 14 olle 55     String ID = req.getParameter("ID");
2964 20 Nov 14 olle 56     String cmd = req.getParameter("cmd");
2964 20 Nov 14 olle 57     JsonUtil.setJsonResponseHeaders(resp);
2964 20 Nov 14 olle 58     
2964 20 Nov 14 olle 59     JSONObject json = new JSONObject();    
2964 20 Nov 14 olle 60     json.put("status", "ok");
2964 20 Nov 14 olle 61     
5468 04 Jun 19 olle 62     //final SessionControl sc = Application.getSessionControl(ID, req.getRemoteAddr());
5744 20 Nov 19 olle 63     //final SessionControl sc  = Application.getSessionControl(ID, "", req.getRemoteAddr(), true);
5744 20 Nov 19 olle 64     final SessionControl sc  = Application.getSessionControl(ID, null, req.getRemoteAddr(), true);
2964 20 Nov 14 olle 65     DbControl dc = null;    
2964 20 Nov 14 olle 66             
2964 20 Nov 14 olle 67     try
2964 20 Nov 14 olle 68     {
2964 20 Nov 14 olle 69       if ("CountCases".equals(cmd))
2964 20 Nov 14 olle 70       {
3668 17 Dec 15 olle 71         dc = sc.newDbControl();
3668 17 Dec 15 olle 72         ItemQuery<Sample> query = Sample.getQuery();
3668 17 Dec 15 olle 73         Subtype.CASE.addFilter(dc, query);
3668 17 Dec 15 olle 74         query.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT);
3668 17 Dec 15 olle 75         query.setCacheResult(true);
3668 17 Dec 15 olle 76         long count = query.count(dc);
3668 17 Dec 15 olle 77         json.put("count", count);
4144 30 Sep 16 olle 78         json.put("sampleItemPrefix", Meludi.fetchSampleItemPrefix(sc.getActiveProjectId()));
4215 08 Nov 16 olle 79         json.put("sampleItemNumDigits", Meludi.fetchSampleItemNumDigits(sc.getActiveProjectId()));
4869 25 Jun 18 olle 80         json.put("bloodItemPrefix", Meludi.fetchBloodItemPrefix(sc.getActiveProjectId()));
3668 17 Dec 15 olle 81       }
3668 17 Dec 15 olle 82       else if ("GetLastLabelCase".equals(cmd))
3668 17 Dec 15 olle 83       {
4131 26 Sep 16 olle 84         dc = sc.newDbControl();
4131 26 Sep 16 olle 85         Project project = Project.getById(dc, sc.getActiveProjectId());
3575 05 Nov 15 olle 86         // Get highest label case number from file
4131 26 Sep 16 olle 87         long count = fetchLabelCaseCount(project.getName());
3575 05 Nov 15 olle 88         if (count < 0)
3575 05 Nov 15 olle 89         {
3575 05 Nov 15 olle 90           // Get number of stored cases
3575 05 Nov 15 olle 91           ItemQuery<Sample> query = Sample.getQuery();
3575 05 Nov 15 olle 92           Subtype.CASE.addFilter(dc, query);
3575 05 Nov 15 olle 93           query.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT);
3575 05 Nov 15 olle 94           query.setCacheResult(true);
3575 05 Nov 15 olle 95           count = query.count(dc);
3575 05 Nov 15 olle 96         }
2964 20 Nov 14 olle 97         json.put("count", count);
4144 30 Sep 16 olle 98         json.put("sampleItemPrefix", Meludi.fetchSampleItemPrefix(sc.getActiveProjectId()));
4215 08 Nov 16 olle 99         json.put("sampleItemNumDigits", Meludi.fetchSampleItemNumDigits(sc.getActiveProjectId()));
2964 20 Nov 14 olle 100       }
2964 20 Nov 14 olle 101       else if ("GetLabelFile".equals(cmd))
2964 20 Nov 14 olle 102       {
4131 26 Sep 16 olle 103         dc = sc.newDbControl();
4144 30 Sep 16 olle 104         int activeProjectId = sc.getActiveProjectId();
4144 30 Sep 16 olle 105         Project project = Project.getById(dc, activeProjectId);
4144 30 Sep 16 olle 106         String sampleItemPrefix = Meludi.fetchSampleItemPrefix(activeProjectId);
4869 25 Jun 18 olle 107         String bloodItemPrefix = Meludi.fetchBloodItemPrefix(activeProjectId);
4876 27 Jun 18 olle 108         boolean bloodAndSampleItemPrefixesDiffer = Meludi.bloodAndSampleItemPrefixesDiffer(activeProjectId);
2964 20 Nov 14 olle 109         String firstPart = "";
2964 20 Nov 14 olle 110         String secondPart = "";
2964 20 Nov 14 olle 111         
2964 20 Nov 14 olle 112         String nofCasesStr = req.getParameter("nofCases");
2964 20 Nov 14 olle 113         String nofTubesPerCaseStr = req.getParameter("nofTubesPerCase");
2964 20 Nov 14 olle 114         String startCase = req.getParameter("startCase");
4869 25 Jun 18 olle 115         String tubeContentType = req.getParameter("tubeContentType");
4252 25 Nov 16 olle 116         Boolean extractsFromFirstSpecimenOnly = Values.getBoolean(req.getParameter("extractsFromFirstSpecimenOnly"), false);
3575 05 Nov 15 olle 117         boolean preview = Values.getBoolean(req.getParameter("preview"), true);
2964 20 Nov 14 olle 118         int nofCases = Integer.parseInt(nofCasesStr);
2964 20 Nov 14 olle 119         int nofTubesPerCase = Integer.parseInt(nofTubesPerCaseStr);
4252 25 Nov 16 olle 120         int nofExtracts = nofTubesPerCase;
4252 25 Nov 16 olle 121         if (extractsFromFirstSpecimenOnly)
4252 25 Nov 16 olle 122         {
4252 25 Nov 16 olle 123           nofExtracts = 1;
4252 25 Nov 16 olle 124         }
4869 25 Jun 18 olle 125         // Get desired item name prefix
4869 25 Jun 18 olle 126         String itemNamePrefix = sampleItemPrefix;
4869 25 Jun 18 olle 127         if (tubeContentType != null && tubeContentType.equals("Blood"))
4869 25 Jun 18 olle 128         {
4869 25 Jun 18 olle 129           itemNamePrefix = bloodItemPrefix;
4869 25 Jun 18 olle 130         }
4869 25 Jun 18 olle 131 //System.out.println("LabelGenerationServlet::doGet(): cmd = \"" + cmd + "\" tubeContentType = " + tubeContentType + " itemNamePrefix = " + itemNamePrefix);
4869 25 Jun 18 olle 132         
2964 20 Nov 14 olle 133         // Possibly zero-padded start case number
4869 25 Jun 18 olle 134         String startCaseNumberStr = startCase.substring(itemNamePrefix.length());
2964 20 Nov 14 olle 135         // Remove leading zeros in start case number
2964 20 Nov 14 olle 136         while (startCaseNumberStr.startsWith("0"))
2964 20 Nov 14 olle 137         {
2964 20 Nov 14 olle 138           startCaseNumberStr = startCaseNumberStr.substring(1);
2964 20 Nov 14 olle 139         }
2964 20 Nov 14 olle 140         int startCaseNumber = Integer.parseInt(startCaseNumberStr);
3575 05 Nov 15 olle 141         int endCaseNumber = startCaseNumber + nofCases - 1;
3575 05 Nov 15 olle 142         if (!preview)
3575 05 Nov 15 olle 143         {
3575 05 Nov 15 olle 144           // Update label case info file
4131 26 Sep 16 olle 145           updateLabelCaseCount(project.getName(), endCaseNumber);
3575 05 Nov 15 olle 146         }
3575 05 Nov 15 olle 147         // Generate label file contents
4215 08 Nov 16 olle 148         Integer sampleItemNumDigits = Meludi.fetchSampleItemNumDigits(sc.getActiveProjectId());
2964 20 Nov 14 olle 149         String separator = "";
2964 20 Nov 14 olle 150
2964 20 Nov 14 olle 151         if (nofCases > 0 && nofTubesPerCase > 0 && startCaseNumber > 0)
2964 20 Nov 14 olle 152         {
2964 20 Nov 14 olle 153           // Create label-text for each tube
2964 20 Nov 14 olle 154           for (int i = 0; i < nofCases; i++)
2964 20 Nov 14 olle 155           {
2964 20 Nov 14 olle 156             int caseNumber = startCaseNumber + i;
2964 20 Nov 14 olle 157             String caseNumberStr = "" + caseNumber;
4215 08 Nov 16 olle 158             while (caseNumberStr.length() < sampleItemNumDigits)
2964 20 Nov 14 olle 159             {
2964 20 Nov 14 olle 160               caseNumberStr = "0" + caseNumberStr;
2964 20 Nov 14 olle 161             }
4869 25 Jun 18 olle 162             String caseName = itemNamePrefix + caseNumberStr;
2964 20 Nov 14 olle 163             
2964 20 Nov 14 olle 164             firstPart += separator + caseName;
2964 20 Nov 14 olle 165             separator = "\n";
2964 20 Nov 14 olle 166             
2964 20 Nov 14 olle 167             for (int j = 1; j <= nofTubesPerCase; j++)
2964 20 Nov 14 olle 168             {
4869 25 Jun 18 olle 169               String tubeName = caseName;
4876 27 Jun 18 olle 170               if (tubeContentType != null && tubeContentType.equals("Blood") && !bloodAndSampleItemPrefixesDiffer)
4869 25 Jun 18 olle 171               {
4869 25 Jun 18 olle 172                 tubeName += ".b";
4869 25 Jun 18 olle 173                 if (j > 1)
4869 25 Jun 18 olle 174                 {
4869 25 Jun 18 olle 175                   tubeName += "" + j;
4869 25 Jun 18 olle 176                 }
4869 25 Jun 18 olle 177               }
4869 25 Jun 18 olle 178               else
4869 25 Jun 18 olle 179               {
4869 25 Jun 18 olle 180                 tubeName += "." + j;
4869 25 Jun 18 olle 181               }
2964 20 Nov 14 olle 182               firstPart += separator + tubeName;
4252 25 Nov 16 olle 183
4252 25 Nov 16 olle 184               if (j <= nofExtracts)
4252 25 Nov 16 olle 185               {
4252 25 Nov 16 olle 186                 secondPart += separator + tubeName + ".r";
4252 25 Nov 16 olle 187                 secondPart += separator + tubeName + ".d";
4252 25 Nov 16 olle 188               }
2964 20 Nov 14 olle 189             }
2964 20 Nov 14 olle 190           }
2964 20 Nov 14 olle 191           String labelString = "LABEL\n" + firstPart + secondPart;
2964 20 Nov 14 olle 192           
2964 20 Nov 14 olle 193           // Send labels in a file to the client.
2964 20 Nov 14 olle 194           resp.setHeader("Content-Disposition", "attachment; filename=Tube_labels.csv");
2964 20 Nov 14 olle 195           resp.setContentType("text/plain");
2964 20 Nov 14 olle 196           ServletOutputStream os = resp.getOutputStream();
2964 20 Nov 14 olle 197           os.print(labelString);          
2964 20 Nov 14 olle 198           os.flush();
2964 20 Nov 14 olle 199           os.close();
2964 20 Nov 14 olle 200         }
2964 20 Nov 14 olle 201       }  
5069 01 Nov 18 olle 202       else if ("GetFfpeSectionLabelFile".equals(cmd))
5069 01 Nov 18 olle 203       {
5069 01 Nov 18 olle 204         dc = sc.newDbControl();
5069 01 Nov 18 olle 205         int activeProjectId = sc.getActiveProjectId();
5069 01 Nov 18 olle 206         Project project = Project.getById(dc, activeProjectId);
5069 01 Nov 18 olle 207         String sampleItemPrefix = Meludi.fetchSampleItemPrefix(activeProjectId);
5069 01 Nov 18 olle 208         String bloodItemPrefix = Meludi.fetchBloodItemPrefix(activeProjectId);
5069 01 Nov 18 olle 209         boolean bloodAndSampleItemPrefixesDiffer = Meludi.bloodAndSampleItemPrefixesDiffer(activeProjectId);
5069 01 Nov 18 olle 210         String firstPart = "";
5069 01 Nov 18 olle 211         String secondPart = "";
5069 01 Nov 18 olle 212
5069 01 Nov 18 olle 213         boolean preview = Values.getBoolean(req.getParameter("preview"), true);
5069 01 Nov 18 olle 214         String jsonFfpeBlockListStr = Values.getString(req.getParameter("ffpeblocklist"), "");
5069 01 Nov 18 olle 215         //System.out.println("LabelGenerationServlet::doGet(): cmd = \"" + cmd + "\" jsonFfpeBlockListStr = " + jsonFfpeBlockListStr);
5069 01 Nov 18 olle 216         // Get list of extract source item names
5069 01 Nov 18 olle 217         List<String> ffpeBlockIdList = new ArrayList<String>();
5069 01 Nov 18 olle 218         JSONArray jsonItems = (JSONArray)new JSONParser().parse(jsonFfpeBlockListStr);
5069 01 Nov 18 olle 219         //System.out.println("LabelGenerationServlet::doGet(): cmd = \"" + cmd + "\" jsonItems = " + jsonItems);
5069 01 Nov 18 olle 220
5069 01 Nov 18 olle 221         // Generate label file contents
5069 01 Nov 18 olle 222         Integer sampleItemNumDigits = Meludi.fetchSampleItemNumDigits(sc.getActiveProjectId());
5069 01 Nov 18 olle 223         String separator = "";
5069 01 Nov 18 olle 224
5069 01 Nov 18 olle 225         for (int i = 0; i < jsonItems.size(); ++i)
5069 01 Nov 18 olle 226         {
5069 01 Nov 18 olle 227           JSONObject jsonItem = (JSONObject)jsonItems.get(i);
5069 01 Nov 18 olle 228           String itemName = (String)jsonItem.get("name");
5069 01 Nov 18 olle 229           ffpeBlockIdList.add(itemName);
5069 01 Nov 18 olle 230           firstPart += separator + itemName + ".s";
5069 01 Nov 18 olle 231           separator = "\n";
5069 01 Nov 18 olle 232         }
5069 01 Nov 18 olle 233         String labelString = "LABEL\n" + firstPart + secondPart;
5069 01 Nov 18 olle 234         
5069 01 Nov 18 olle 235         // Send labels in a file to the client.
5069 01 Nov 18 olle 236         resp.setHeader("Content-Disposition", "attachment; filename=FFPE_section_labels.csv");
5069 01 Nov 18 olle 237         resp.setContentType("text/plain");
5069 01 Nov 18 olle 238         ServletOutputStream os = resp.getOutputStream();
5069 01 Nov 18 olle 239         os.print(labelString);          
5069 01 Nov 18 olle 240         os.flush();
5069 01 Nov 18 olle 241         os.close();
5069 01 Nov 18 olle 242       }  
5069 01 Nov 18 olle 243       else if ("GetHeGlassLabelFile".equals(cmd))
5069 01 Nov 18 olle 244       {
5069 01 Nov 18 olle 245         dc = sc.newDbControl();
5069 01 Nov 18 olle 246         int activeProjectId = sc.getActiveProjectId();
5069 01 Nov 18 olle 247         Project project = Project.getById(dc, activeProjectId);
5069 01 Nov 18 olle 248         String sampleItemPrefix = Meludi.fetchSampleItemPrefix(activeProjectId);
5069 01 Nov 18 olle 249         String bloodItemPrefix = Meludi.fetchBloodItemPrefix(activeProjectId);
5069 01 Nov 18 olle 250         boolean bloodAndSampleItemPrefixesDiffer = Meludi.bloodAndSampleItemPrefixesDiffer(activeProjectId);
5069 01 Nov 18 olle 251         String firstPart = "";
5069 01 Nov 18 olle 252         String secondPart = "";
5069 01 Nov 18 olle 253
5069 01 Nov 18 olle 254         boolean preview = Values.getBoolean(req.getParameter("preview"), true);
5069 01 Nov 18 olle 255         String jsonFfpeBlockListStr = Values.getString(req.getParameter("ffpeblocklist"), "");
5069 01 Nov 18 olle 256         //System.out.println("LabelGenerationServlet::doGet(): cmd = \"" + cmd + "\" jsonFfpeBlockListStr = " + jsonFfpeBlockListStr);
5069 01 Nov 18 olle 257         // Get list of extract source item names
5069 01 Nov 18 olle 258         List<String> ffpeBlockIdList = new ArrayList<String>();
5069 01 Nov 18 olle 259         JSONArray jsonItems = (JSONArray)new JSONParser().parse(jsonFfpeBlockListStr);
5069 01 Nov 18 olle 260         //System.out.println("LabelGenerationServlet::doGet(): cmd = \"" + cmd + "\" jsonItems = " + jsonItems);
5069 01 Nov 18 olle 261
5069 01 Nov 18 olle 262         // Generate label file contents
5069 01 Nov 18 olle 263         Integer sampleItemNumDigits = Meludi.fetchSampleItemNumDigits(sc.getActiveProjectId());
5069 01 Nov 18 olle 264         String separator = "";
5069 01 Nov 18 olle 265
5069 01 Nov 18 olle 266         for (int i = 0; i < jsonItems.size(); ++i)
5069 01 Nov 18 olle 267         {
5069 01 Nov 18 olle 268           JSONObject jsonItem = (JSONObject)jsonItems.get(i);
5069 01 Nov 18 olle 269           String itemName = (String)jsonItem.get("name");
5069 01 Nov 18 olle 270           ffpeBlockIdList.add(itemName);
5083 12 Nov 18 olle 271           firstPart += separator + itemName + ".F";
5069 01 Nov 18 olle 272           separator = "\n";
5083 12 Nov 18 olle 273           firstPart += separator + itemName + ".E";
5069 01 Nov 18 olle 274         }
5069 01 Nov 18 olle 275         String labelString = "LABEL\n" + firstPart + secondPart;
5069 01 Nov 18 olle 276         
5069 01 Nov 18 olle 277         // Send labels in a file to the client.
5069 01 Nov 18 olle 278         resp.setHeader("Content-Disposition", "attachment; filename=HE_glass_labels.csv");
5069 01 Nov 18 olle 279         resp.setContentType("text/plain");
5069 01 Nov 18 olle 280         ServletOutputStream os = resp.getOutputStream();
5069 01 Nov 18 olle 281         os.print(labelString);          
5069 01 Nov 18 olle 282         os.flush();
5069 01 Nov 18 olle 283         os.close();
5069 01 Nov 18 olle 284       }  
5264 24 Jan 19 olle 285       else if ("GetSerumLabelFile".equals(cmd))
5264 24 Jan 19 olle 286       {
5264 24 Jan 19 olle 287         dc = sc.newDbControl();
5264 24 Jan 19 olle 288         int activeProjectId = sc.getActiveProjectId();
5264 24 Jan 19 olle 289         // No JSON output
5264 24 Jan 19 olle 290         json = null;
5264 24 Jan 19 olle 291         
5264 24 Jan 19 olle 292         int batchType = Values.getInteger(req.getParameter("batchType"), 1);
5264 24 Jan 19 olle 293         String startItemName = req.getParameter("startitemname");
5264 24 Jan 19 olle 294         int nofItems = Values.getInteger(req.getParameter("nofformsets"), 1);
5264 24 Jan 19 olle 295         String itemPrefix = Meludi.fetchReferralPrefix(activeProjectId);
5264 24 Jan 19 olle 296         String startItemIdDigits = Meludi.fetchReferralDigits(startItemName, activeProjectId);
5264 24 Jan 19 olle 297         boolean preview = Values.getBoolean(req.getParameter("preview"), true);
5264 24 Jan 19 olle 298         String firstPart = "";
5264 24 Jan 19 olle 299         String secondPart = "";
5264 24 Jan 19 olle 300
5264 24 Jan 19 olle 301         // Generate label file contents
5264 24 Jan 19 olle 302         Integer sampleItemNumDigits = Meludi.fetchSampleItemNumDigits(sc.getActiveProjectId());
5264 24 Jan 19 olle 303         String separator = "";
5264 24 Jan 19 olle 304
5264 24 Jan 19 olle 305         //for (int i = 0; i < jsonItems.size(); ++i)
5264 24 Jan 19 olle 306         //String referralLabelPrefix = "SC2798";
5264 24 Jan 19 olle 307         String referralLabelPrefix = "2798";
5264 24 Jan 19 olle 308         String itemDigits = startItemIdDigits;
5264 24 Jan 19 olle 309         for (int i = 0; i < nofItems; i++)
5264 24 Jan 19 olle 310         {
5264 24 Jan 19 olle 311           if (i > 0)
5264 24 Jan 19 olle 312           {
5264 24 Jan 19 olle 313             itemDigits = nextItemIdDigits(itemDigits);            
5264 24 Jan 19 olle 314           }
5264 24 Jan 19 olle 315           //String itemName = itemPrefix + itemDigits;
5264 24 Jan 19 olle 316           String itemName = itemDigits;
5264 24 Jan 19 olle 317           for (int j = 1; j < 9; j++)
5264 24 Jan 19 olle 318           {
5264 24 Jan 19 olle 319             for (int k = 1; k < 5; k++)
5264 24 Jan 19 olle 320             {
5264 24 Jan 19 olle 321               //firstPart += separator + referralLabelPrefix + "-" + itemName + "-" + j + "-" + k;
5264 24 Jan 19 olle 322               //firstPart += separator + referralLabelPrefix + itemName + "-" + j + "-" + k;
5264 24 Jan 19 olle 323               firstPart += separator + referralLabelPrefix + itemName + "-" + j + "" + k;
5264 24 Jan 19 olle 324               separator = "\n";
5264 24 Jan 19 olle 325             }            
5264 24 Jan 19 olle 326           }
5264 24 Jan 19 olle 327         }
5264 24 Jan 19 olle 328         //String labelString = "LABEL\n" + firstPart + secondPart;
5264 24 Jan 19 olle 329         String labelString = firstPart + secondPart;
5264 24 Jan 19 olle 330         
5264 24 Jan 19 olle 331         // Send labels in a file to the client.
5264 24 Jan 19 olle 332         String endItemName = itemPrefix + itemDigits;
5264 24 Jan 19 olle 333         String filename = "serum_labels_" + startItemName + "-" + endItemName + ".csv";
5264 24 Jan 19 olle 334         String headerArg1 = "attachment; filename=" + filename;
5264 24 Jan 19 olle 335         //resp.setHeader("Content-Disposition", "attachment; filename=referral_labels.csv");
5264 24 Jan 19 olle 336         resp.setHeader("Content-Disposition", headerArg1);
5264 24 Jan 19 olle 337         resp.setContentType("text/plain");
5264 24 Jan 19 olle 338         ServletOutputStream os = resp.getOutputStream();
5264 24 Jan 19 olle 339         os.print(labelString);          
5264 24 Jan 19 olle 340         os.flush();
5264 24 Jan 19 olle 341         os.close();
5264 24 Jan 19 olle 342       }
5858 10 Mar 20 olle 343       else if ("GetDnaRnaLabelFile".equals(cmd))
5858 10 Mar 20 olle 344       {
5858 10 Mar 20 olle 345         dc = sc.newDbControl();
5858 10 Mar 20 olle 346         int activeProjectId = sc.getActiveProjectId();
5858 10 Mar 20 olle 347         Project project = Project.getById(dc, activeProjectId);
5858 10 Mar 20 olle 348         String sampleItemPrefix = Meludi.fetchSampleItemPrefix(activeProjectId);
5858 10 Mar 20 olle 349         String bloodItemPrefix = Meludi.fetchBloodItemPrefix(activeProjectId);
5858 10 Mar 20 olle 350         boolean bloodAndSampleItemPrefixesDiffer = Meludi.bloodAndSampleItemPrefixesDiffer(activeProjectId);
5858 10 Mar 20 olle 351         String firstPart = "";
5858 10 Mar 20 olle 352         String secondPart = "";
5858 10 Mar 20 olle 353
5858 10 Mar 20 olle 354         boolean preview = Values.getBoolean(req.getParameter("preview"), true);
5858 10 Mar 20 olle 355         String jsonSelItemsListStr = Values.getString(req.getParameter("selitemslist"), "");
5858 10 Mar 20 olle 356         // Get list of extract source item names
5858 10 Mar 20 olle 357         List<String> selItemsIdList = new ArrayList<String>();
5858 10 Mar 20 olle 358         JSONArray jsonItems = (JSONArray)new JSONParser().parse(jsonSelItemsListStr);
5858 10 Mar 20 olle 359
5858 10 Mar 20 olle 360         // Generate label file contents
5858 10 Mar 20 olle 361         Integer sampleItemNumDigits = Meludi.fetchSampleItemNumDigits(sc.getActiveProjectId());
5858 10 Mar 20 olle 362         String separator = "";
5858 10 Mar 20 olle 363
5858 10 Mar 20 olle 364         for (int i = 0; i < jsonItems.size(); ++i)
5858 10 Mar 20 olle 365         {
5858 10 Mar 20 olle 366           JSONObject jsonItem = (JSONObject)jsonItems.get(i);
5858 10 Mar 20 olle 367           String itemName = (String)jsonItem.get("name");
5858 10 Mar 20 olle 368           // Simplify item name by omitting ".s" for FFPR section (specimen)
5858 10 Mar 20 olle 369           itemName = itemName.replace(".s", "");
5858 10 Mar 20 olle 370           selItemsIdList.add(itemName);
5858 10 Mar 20 olle 371           //firstPart += separator + itemName + ".s";
5858 10 Mar 20 olle 372           firstPart += separator + itemName + ".d";
5858 10 Mar 20 olle 373           separator = "\n";
5858 10 Mar 20 olle 374           firstPart += separator + itemName + ".r";
5858 10 Mar 20 olle 375           separator = "\n";
5858 10 Mar 20 olle 376         }
5858 10 Mar 20 olle 377         String labelString = "LABEL\n" + firstPart + secondPart;
5858 10 Mar 20 olle 378
5858 10 Mar 20 olle 379         // Get filename with time stamp
5858 10 Mar 20 olle 380         String filename = "dna_rna_labels.csv";
5858 10 Mar 20 olle 381         // Add time stamp to download filename
5858 10 Mar 20 olle 382         DateToStringConverter d2 = new DateToStringConverter(new SimpleDateFormat("yyyyMMdd_HHmm"));
5858 10 Mar 20 olle 383         String timeStampStr = d2.convert(new Date());
5858 10 Mar 20 olle 384         String fileExt = "";
5858 10 Mar 20 olle 385         int fileExtIndex = filename.lastIndexOf(".");
5858 10 Mar 20 olle 386         if (fileExtIndex >= 0)
5858 10 Mar 20 olle 387         {
5858 10 Mar 20 olle 388           // Get file extension
5858 10 Mar 20 olle 389           fileExt = filename.substring(fileExtIndex);
5858 10 Mar 20 olle 390           // Remove file extension
5858 10 Mar 20 olle 391           filename = filename.substring(0, fileExtIndex);
5858 10 Mar 20 olle 392         }
5858 10 Mar 20 olle 393         filename += "_" + timeStampStr + fileExt;
5858 10 Mar 20 olle 394         
5858 10 Mar 20 olle 395         // Send labels in a file to the client.
5858 10 Mar 20 olle 396         resp.setHeader("Content-Disposition", "attachment; filename=" + filename);
5858 10 Mar 20 olle 397         resp.setContentType("text/plain");
5858 10 Mar 20 olle 398         ServletOutputStream os = resp.getOutputStream();
5858 10 Mar 20 olle 399         os.print(labelString);          
5858 10 Mar 20 olle 400         os.flush();
5858 10 Mar 20 olle 401         os.close();
5858 10 Mar 20 olle 402       }  
2964 20 Nov 14 olle 403     }
2964 20 Nov 14 olle 404     catch (Throwable t)
2964 20 Nov 14 olle 405     {
2964 20 Nov 14 olle 406       t.printStackTrace();
2964 20 Nov 14 olle 407       json.clear();
2964 20 Nov 14 olle 408       json.put("status", "error");
2964 20 Nov 14 olle 409       json.put("message", t.getMessage());
2964 20 Nov 14 olle 410       json.put("stacktrace", ThrowableUtil.stackTraceToString(t));
2964 20 Nov 14 olle 411     }
2964 20 Nov 14 olle 412     finally
2964 20 Nov 14 olle 413     {
2964 20 Nov 14 olle 414       if (dc!=null) dc.close();
2964 20 Nov 14 olle 415       json.writeJSONString(resp.getWriter());    
2964 20 Nov 14 olle 416     }
2964 20 Nov 14 olle 417   }
3575 05 Nov 15 olle 418   
4131 26 Sep 16 olle 419   private long fetchLabelCaseCount(String projectName)
3575 05 Nov 15 olle 420   {
3575 05 Nov 15 olle 421     long highestCaseNum = -1;
4131 26 Sep 16 olle 422     HashMap<String,String> projectNameHighestCaseNumHM = fetchLabelCaseFileContents();
4131 26 Sep 16 olle 423     if (projectNameHighestCaseNumHM != null)
4131 26 Sep 16 olle 424     {
4131 26 Sep 16 olle 425       String value = projectNameHighestCaseNumHM.get(projectName);
4131 26 Sep 16 olle 426       if (value != null && !value.equals(""))
4131 26 Sep 16 olle 427       {
4131 26 Sep 16 olle 428         highestCaseNum = Long.parseLong(value);
4131 26 Sep 16 olle 429       }
4131 26 Sep 16 olle 430     }
4131 26 Sep 16 olle 431     return highestCaseNum;
4131 26 Sep 16 olle 432   }
4131 26 Sep 16 olle 433
4131 26 Sep 16 olle 434   private HashMap<String,String> fetchLabelCaseFileContents()
4131 26 Sep 16 olle 435   {
3575 05 Nov 15 olle 436     // Place highest case label file in BASE user files directory
3575 05 Nov 15 olle 437     String caseLabelInfoFileName = CASE_LABEL_INFO_FILENAME;
3575 05 Nov 15 olle 438     java.io.File userFilesDir = Application.getUserFilesDirectory();
3575 05 Nov 15 olle 439     String fileDir = userFilesDir.getAbsolutePath();
3575 05 Nov 15 olle 440     String caseLabelInfoFilePath = fileDir + "/" + caseLabelInfoFileName;
3575 05 Nov 15 olle 441     java.io.File caseLabelInfoFile = new java.io.File(caseLabelInfoFilePath);
4131 26 Sep 16 olle 442     HashMap<String,String> projectNameHighestCaseNumHM = new HashMap<String,String>();
4131 26 Sep 16 olle 443     String separator = "\t";
3575 05 Nov 15 olle 444     if (caseLabelInfoFile.exists() && !caseLabelInfoFile.isDirectory())
3575 05 Nov 15 olle 445     {
3575 05 Nov 15 olle 446       // Load data from file
3575 05 Nov 15 olle 447       java.io.FileReader fileReader = null;
3575 05 Nov 15 olle 448       try
3575 05 Nov 15 olle 449       {
3575 05 Nov 15 olle 450         fileReader = new java.io.FileReader(caseLabelInfoFile);
3575 05 Nov 15 olle 451         java.io.BufferedReader bufferedReader = new java.io.BufferedReader(fileReader);
4131 26 Sep 16 olle 452         // Read lines until key in first column equals project name
3575 05 Nov 15 olle 453         String inline;
3575 05 Nov 15 olle 454         while ((inline = bufferedReader.readLine()) != null)
3575 05 Nov 15 olle 455         {
3575 05 Nov 15 olle 456           if (inline != null)
3575 05 Nov 15 olle 457           {
3575 05 Nov 15 olle 458             String[] columns = inline.split(separator, -1);
3575 05 Nov 15 olle 459             if (columns.length > 0)
3575 05 Nov 15 olle 460             {
3575 05 Nov 15 olle 461               String key = columns[0];
3575 05 Nov 15 olle 462               if (columns.length > 1)
3575 05 Nov 15 olle 463               {
3575 05 Nov 15 olle 464                 String value = columns[1];
4131 26 Sep 16 olle 465                 projectNameHighestCaseNumHM.put(key, value);
3575 05 Nov 15 olle 466               }
3575 05 Nov 15 olle 467             }
3575 05 Nov 15 olle 468           }                
3575 05 Nov 15 olle 469         }
3575 05 Nov 15 olle 470         fileReader.close();
3575 05 Nov 15 olle 471       }
3575 05 Nov 15 olle 472       catch (IOException ex)
3575 05 Nov 15 olle 473       {
4131 26 Sep 16 olle 474         System.out.println(new Date() + " LabelGenerationServlet::fetchLabelCaseFileContents(): IOException when trying to get file reader for  = \"" + caseLabelInfoFilePath + "\" e: " + ex);
4131 26 Sep 16 olle 475         return null;
3575 05 Nov 15 olle 476       }
3575 05 Nov 15 olle 477     }
4131 26 Sep 16 olle 478     return projectNameHighestCaseNumHM;
3575 05 Nov 15 olle 479   }
3575 05 Nov 15 olle 480
4131 26 Sep 16 olle 481   private void updateLabelCaseCount(String projectName, int endCaseNumber)
3575 05 Nov 15 olle 482   {
4131 26 Sep 16 olle 483     // Get current contents of highest case label file
4131 26 Sep 16 olle 484     HashMap<String,String> projectNameHighestCaseNumHM = fetchLabelCaseFileContents();
4131 26 Sep 16 olle 485     String[] keyArr = null;
4131 26 Sep 16 olle 486     if (projectNameHighestCaseNumHM != null)
4131 26 Sep 16 olle 487     {
4131 26 Sep 16 olle 488       Set<String> keySet = projectNameHighestCaseNumHM.keySet();
4131 26 Sep 16 olle 489       keyArr = keySet.toArray(new String[keySet.size()]);
4131 26 Sep 16 olle 490     }
3575 05 Nov 15 olle 491     // Place highest case label file in BASE user files directory
3575 05 Nov 15 olle 492     String caseLabelInfoFileName = CASE_LABEL_INFO_FILENAME;
3575 05 Nov 15 olle 493     java.io.File userFilesDir = Application.getUserFilesDirectory();
3575 05 Nov 15 olle 494     String fileDir = userFilesDir.getAbsolutePath();
3575 05 Nov 15 olle 495     String caseLabelInfoFilePath = fileDir + "/" + caseLabelInfoFileName;
3575 05 Nov 15 olle 496     java.io.File caseLabelInfoFile = new java.io.File(caseLabelInfoFilePath);
4131 26 Sep 16 olle 497     String separator = "\t";
3597 12 Nov 15 olle 498     if (!caseLabelInfoFile.isDirectory())
3575 05 Nov 15 olle 499     {
3575 05 Nov 15 olle 500       // Save new/updated library preparation reagents file
3575 05 Nov 15 olle 501       java.io.FileWriter fileWriter = null;
3575 05 Nov 15 olle 502       try
3575 05 Nov 15 olle 503       {
3575 05 Nov 15 olle 504         fileWriter = new FileWriter(caseLabelInfoFile);
4131 26 Sep 16 olle 505         boolean updatedKeyFound = false;
4131 26 Sep 16 olle 506         if (keyArr != null)
4131 26 Sep 16 olle 507         {
4131 26 Sep 16 olle 508           for (int i = 0; i < keyArr.length; i++)
4131 26 Sep 16 olle 509           {
4131 26 Sep 16 olle 510             String key = keyArr[i];
4131 26 Sep 16 olle 511             String valueStr = projectNameHighestCaseNumHM.get(key);
4131 26 Sep 16 olle 512             long value = Long.parseLong(valueStr);
4131 26 Sep 16 olle 513             // If updated project found in list, write new updated value to file
4131 26 Sep 16 olle 514             if (projectName.equals(key))
4131 26 Sep 16 olle 515             {
4131 26 Sep 16 olle 516               value = endCaseNumber;
4131 26 Sep 16 olle 517               updatedKeyFound = true;
4131 26 Sep 16 olle 518             }
4131 26 Sep 16 olle 519             String line = key + separator + value;
4131 26 Sep 16 olle 520             fileWriter.write(line + "\n");
4131 26 Sep 16 olle 521           }
4131 26 Sep 16 olle 522         }
4131 26 Sep 16 olle 523         // If updated project not found in list, add new entry to file
4131 26 Sep 16 olle 524         if (!updatedKeyFound)
4131 26 Sep 16 olle 525         {
4131 26 Sep 16 olle 526           String line = projectName + separator + endCaseNumber;
4131 26 Sep 16 olle 527           fileWriter.write(line + "\n");
4131 26 Sep 16 olle 528         }
3575 05 Nov 15 olle 529
3575 05 Nov 15 olle 530         fileWriter.flush();
3575 05 Nov 15 olle 531         fileWriter.close();
3575 05 Nov 15 olle 532       }
3575 05 Nov 15 olle 533       catch(IOException ex)
3575 05 Nov 15 olle 534       {
3668 17 Dec 15 olle 535         System.out.println(new Date() + " LabelGenerationServlet::updateLabelCaseCount(): IOException when trying to get file writer for caseLabelInfoFilePath = " + caseLabelInfoFilePath);
3575 05 Nov 15 olle 536         return;
3575 05 Nov 15 olle 537       }
3575 05 Nov 15 olle 538     }
3575 05 Nov 15 olle 539   }
5264 24 Jan 19 olle 540
5264 24 Jan 19 olle 541   private String nextItemIdDigits(String itemIdDigits)
5264 24 Jan 19 olle 542   {
5264 24 Jan 19 olle 543     String nextItemIdDigits = nextItemIdDigits(itemIdDigits, 1);
5264 24 Jan 19 olle 544     return nextItemIdDigits;
5264 24 Jan 19 olle 545   }
5264 24 Jan 19 olle 546
5264 24 Jan 19 olle 547   /**
5264 24 Jan 19 olle 548    * Increments an input item id with or without site prefix
5264 24 Jan 19 olle 549    * a given increment.
5264 24 Jan 19 olle 550    * 
5264 24 Jan 19 olle 551    * @param itemIdDigits String The item id with or without site prefix.
5264 24 Jan 19 olle 552    * @param incr Integer Increment of item id.
5264 24 Jan 19 olle 553    * @return String The item id with given increment.
5264 24 Jan 19 olle 554    */
5264 24 Jan 19 olle 555   private String nextItemIdDigits(String itemIdDigits, Integer incr)
5264 24 Jan 19 olle 556   {
5264 24 Jan 19 olle 557     String nextItemIdDigits = null;
5264 24 Jan 19 olle 558     String sitePrefix = "";
5264 24 Jan 19 olle 559     String itemIdDigitsPure = "";
5264 24 Jan 19 olle 560     if (itemIdDigits != null)
5264 24 Jan 19 olle 561     {
5264 24 Jan 19 olle 562       if (itemIdDigits.length() > 6)
5264 24 Jan 19 olle 563       {        
5264 24 Jan 19 olle 564         sitePrefix = itemIdDigits.substring(0,sitePrefixLength);
5264 24 Jan 19 olle 565         itemIdDigitsPure = itemIdDigits.substring(sitePrefixLength);
5264 24 Jan 19 olle 566       }
5264 24 Jan 19 olle 567       else if (itemIdDigits.length() > 4)
5264 24 Jan 19 olle 568       {        
5264 24 Jan 19 olle 569         itemIdDigitsPure = itemIdDigits;
5264 24 Jan 19 olle 570       }
5264 24 Jan 19 olle 571       String itemIdDigitsSuffix = "";
5264 24 Jan 19 olle 572       if (itemIdDigitsPure.length() > 5)
5264 24 Jan 19 olle 573       {
5264 24 Jan 19 olle 574         // Extract item ID suffix
5264 24 Jan 19 olle 575         itemIdDigitsSuffix = itemIdDigitsPure.substring(itemIdDigitsPure.length() - 1, itemIdDigitsPure.length());
5264 24 Jan 19 olle 576         itemIdDigitsPure = itemIdDigitsPure.substring(0, itemIdDigitsPure.length() - 1);
5264 24 Jan 19 olle 577       }
5264 24 Jan 19 olle 578       // Remove initial zeroes
5264 24 Jan 19 olle 579       while (itemIdDigitsPure.indexOf("0") == 0)
5264 24 Jan 19 olle 580       {
5264 24 Jan 19 olle 581         // Remove initial zero
5264 24 Jan 19 olle 582         itemIdDigitsPure = itemIdDigitsPure.substring(1);        
5264 24 Jan 19 olle 583       }
5264 24 Jan 19 olle 584       String nextItemIdDigitsPure = "";
5264 24 Jan 19 olle 585       if (itemIdDigitsPure.length() > 0)
5264 24 Jan 19 olle 586       {
5264 24 Jan 19 olle 587         int itemIdDigitsPureInt = Integer.parseInt(itemIdDigitsPure);
5264 24 Jan 19 olle 588         int nextItemIdDigitsPureInt = itemIdDigitsPureInt + incr;
5264 24 Jan 19 olle 589         nextItemIdDigitsPure = "" + nextItemIdDigitsPureInt;
5264 24 Jan 19 olle 590       }
5264 24 Jan 19 olle 591       // Add initial zeroes
5264 24 Jan 19 olle 592       while (nextItemIdDigitsPure.length() < 5)
5264 24 Jan 19 olle 593       {
5264 24 Jan 19 olle 594         // Add initial zero
5264 24 Jan 19 olle 595         nextItemIdDigitsPure = "0" + nextItemIdDigitsPure;        
5264 24 Jan 19 olle 596       }
5264 24 Jan 19 olle 597       // Add item ID prefix and optional suffix
5264 24 Jan 19 olle 598       nextItemIdDigits = sitePrefix + nextItemIdDigitsPure + itemIdDigitsSuffix;
5264 24 Jan 19 olle 599     }
5264 24 Jan 19 olle 600     return nextItemIdDigits;
5264 24 Jan 19 olle 601   }
2964 20 Nov 14 olle 602 }