Changeset 5000


Ignore:
Timestamp:
Oct 3, 2018, 4:58:03 PM (4 years ago)
Author:
olle
Message:

Refs #1029. Base-line registration wizard updated to ask user for a tab-separated CSV file to get blood tube information from, and to use the new blood item naming scheme with integer suffices to a common blood item base name for blood item relat4ed to the same Case item:

  1. JSP file index.jsp in resources/ updated in section "Personal information wizards" by coupling base-line registration to new JSP file baseline_from_file_alt_rec.jsp in resources/personal/ .
  2. New JSP file baseline_from_file_alt_rec.jsp in resources/personal/ added. It is coupled to new Javascript file baseline_from_file_alt_rec.js in resources/personal/.
  3. New javascript file baseline_from_file_alt_rec.js in resources/personal/ added. It parses a given input tab-separated CSV file and presents the found values in dedicated fields in the JSP file. If the "Register" button is pressed, data is sent to command "RegisterBloodSamples" in servlet BaseLineRegistrationServlet.
  4. Java servlet class/file BaseLineRegistrationServlet.java in src/net/sf/basedb/meludi/servlet/ updated:
    a. Protected method void doGet(HttpServletRequest req, HttpServletResponse resp) updated with new command "RegisterBloodSamples". It obtains values from the parsed input file from the request, and creates new blood items for case items found from the referral ID values. If value of "Whole blood" flag is false, no blood item is created, but the Case item is updated by setting annotation WHOLE_BLOOD to false.
    b. Private method String fetchNewBloodItemName(DbControl dc) updated to the new blood item naming scheme with integer suffices to a common blood item base name for blood item relat4ed to the same Case item.
Location:
extensions/net.sf.basedb.meludi/trunk
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • extensions/net.sf.basedb.meludi/trunk/resources/index.jsp

    r4916 r5000  
    867867          <dd>
    868868            <ul>
     869
     870            <li><span class="require-permission" data-role="PatientCurator" data-link="personal/baseline_from_file_alt_rec.jsp?ID=<%=ID%>"
     871              >BASE-line registration</span>
     872<!--
    869873            <li><span class="require-permission" data-role="PatientCurator" data-link="personal/baseline_alt_rec.jsp?ID=<%=ID%>"
    870               >BASE-line registration</span>
    871 
     874              >BASE-line registration (reference only)</span>
     875-->
    872876            <li><span class="require-permission" data-role="PatientCurator" data-link="personal/ffpe_block_order_form.jsp?ID=<%=ID%>"
    873877              >FFPE block order form</span>
    874878
     879            <li><span class="require-permission" data-role="PatientCurator" data-link="personal/ffpe_section_order_form.jsp?ID=<%=ID%>"
     880              >FFPE section order form</span>
     881              <span class="counter" data-counter="ffpeblocks-all"
     882              title="Number of FFPE blocks">∙</span>
     883<!--
    875884            <li><span class="require-permission" data-role="PatientCurator" data-link="personal/ffpe_section_order_form_sequential.jsp?ID=<%=ID%>"
    876885              >FFPE section order form - sequential FFPE block names</span>
    877 
    878             <li><span class="require-permission" data-role="PatientCurator" data-link="personal/ffpe_section_order_form.jsp?ID=<%=ID%>"
    879               >FFPE section order form - selected FFPE blocks</span>
    880               <span class="counter" data-counter="ffpeblocks-all"
    881               title="Number of FFPE blocks">∙</span>
     886-->
    882887            </ul>
    883888          </dd>
  • extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/servlet/BaseLineRegistrationServlet.java

    r4958 r5000  
    12381238        CounterService.getInstance().setForceCount();
    12391239      }
     1240      else if ("RegisterBloodSamples".equals(cmd))
     1241      {
     1242        dc = sc.newDbControl();
     1243
     1244        MeludiRole.checkPermission(dc, "'" + cmd + "' wizard", MeludiRole.PATIENT_CURATOR, MeludiRole.ADMINISTRATOR);
     1245
     1246        JSONObject jsonReq = (JSONObject)new JSONParser().parse(req.getReader());
     1247        JSONObject jsonBloodTot = (JSONObject)jsonReq.get("bloodInfo");
     1248        JSONArray jsonBlood = (JSONArray)jsonBloodTot.get("blood");
     1249
     1250        // Register the blood tubes
     1251        int numUpdatedBloodTubes = 0;
     1252        if (jsonBlood != null && jsonBlood.size() > 0)
     1253        {
     1254          HashMap<String, String> caseNameHighestBloodNameHashMap = new HashMap<String, String>();
     1255          HashMap<String, BioPlate> bioPlateNamePlateHashMap = new HashMap<String, BioPlate>();
     1256          String bloodItemPrefix = Meludi.fetchBloodItemPrefix(sc.getActiveProjectId());
     1257          int sampleItemNumDigits = Meludi.fetchSampleItemNumDigits(sc.getActiveProjectId());
     1258         
     1259          // Get highest blood item name (all cases)
     1260          String highestBloodItemName = fetchHighestBloodItemName(dc);
     1261          if (highestBloodItemName == null)
     1262          {
     1263            // Create dummy blood item name with suffix .0
     1264            highestBloodItemName = "";
     1265            while (highestBloodItemName.length() < sampleItemNumDigits)
     1266            {
     1267              highestBloodItemName = "0" + highestBloodItemName;
     1268            }
     1269            // Add prefix and suffix
     1270            highestBloodItemName = bloodItemPrefix + highestBloodItemName + ".0";
     1271          }
     1272
     1273          for (int i = 0; i < jsonBlood.size(); ++i)
     1274          {
     1275            JSONObject jsonBloodItem = (JSONObject)jsonBlood.get(i);
     1276            String tubeLabel = (String)jsonBloodItem.get("tubeLabel");
     1277            String box = (String)jsonBloodItem.get("box");
     1278            String row = (String)jsonBloodItem.get("row");
     1279            String column = (String)jsonBloodItem.get("column");
     1280            String arrivalDateString = (String)jsonBloodItem.get("arrivalDate");
     1281            // Remove optional hyphens "-" from date string before conversion to date
     1282            arrivalDateString = arrivalDateString.replaceAll("-", "");
     1283            Date arrivalDate = Meludi.CONVERTER_STRING_TO_DATE.convert(arrivalDateString);
     1284            Boolean wholeBlood = (Boolean)jsonBloodItem.get("wholeBloodCB");
     1285            // Currently sampling date is unknown
     1286            Date samplingDate = null;
     1287
     1288            // Get blood item name to use (base name + integer suffix)
     1289            //
     1290            String bloodItemBaseName = "";
     1291            int bloodItemNumber = 0;
     1292            String bloodItemName = null;
     1293            // Get referral ID from tube label by removing suffix
     1294            String referralId = tubeLabel;
     1295            int dotIndex = referralId.indexOf(".");
     1296            if (dotIndex >= 0)
     1297            {
     1298              // Remove part starting with first dot
     1299              referralId = referralId.substring(0, dotIndex);
     1300            }
     1301            // Find case name from referral ID
     1302            String caseName = null;
     1303            Case theCase = Case.findByReferralId(dc, referralId);
     1304            if (theCase != null)
     1305            {
     1306              caseName = theCase.getName();
     1307            }
     1308
     1309            if (!wholeBlood)
     1310            {
     1311              // Not whole blood, do not create blood item, update Case 'WholeBlood' annotation
     1312              if (wholeBlood != null) Annotationtype.WHOLE_BLOOD.setAnnotationValue(dc, theCase.getSample(), wholeBlood);
     1313              jsonMessages.add("Referral ID '" + referralId + "' [case = " + caseName + "] updated for 'Whole blood' = false.");
     1314            }
     1315            else
     1316            {
     1317              String highestBloodItemNameForCase = null;
     1318              // Check if existing blood items exists for case in hash map
     1319              highestBloodItemNameForCase = (String)caseNameHighestBloodNameHashMap.get(caseName);
     1320              if (highestBloodItemNameForCase == null)
     1321              {
     1322                // Check if existing blood items exists for case (sorted ascending after name)
     1323                List<Blood> bloodItems = null;
     1324                bloodItems = Blood.findAllByCaseName(dc, caseName);
     1325         
     1326                if (bloodItems.size() > 0)
     1327                {
     1328                  highestBloodItemNameForCase = ((Blood)bloodItems.get(bloodItems.size() - 1)).getName();
     1329                  // Update hash map with highest blood name for case
     1330                  caseNameHighestBloodNameHashMap.put(caseName, highestBloodItemNameForCase);
     1331                }
     1332              }
     1333           
     1334              if (highestBloodItemNameForCase != null)
     1335              {
     1336                // Get new blood item name by incrementing suffix number for existing blood item name
     1337                //
     1338                // Get base name (name without suffix) for highest blood item for case
     1339                dotIndex = highestBloodItemNameForCase.indexOf(".");
     1340                if (dotIndex > -1)
     1341                {
     1342                  bloodItemBaseName = highestBloodItemNameForCase.substring(0, dotIndex);
     1343                  // Get suffix number string
     1344                  String bloodItemNumberString = highestBloodItemNameForCase.substring(dotIndex + 1);
     1345                  if (bloodItemNumberString != null)
     1346                  {
     1347                    bloodItemNumber = Integer.valueOf(bloodItemNumberString);
     1348                  }
     1349                  // Increment blood item suffix number for new blood item
     1350                  bloodItemNumber = bloodItemNumber + 1;
     1351                  // Get new blood item name
     1352                  bloodItemName = bloodItemBaseName + "." + bloodItemNumber;
     1353                }
     1354              }
     1355              else
     1356              {
     1357                // Get completely new blood item name (new base name with incremented number)
     1358                // Get base name (name without suffix) for highest blood item
     1359                String highestBloodItemBaseName = null;
     1360                dotIndex = highestBloodItemName.indexOf(".");
     1361                if (dotIndex > -1)
     1362                {
     1363                  highestBloodItemBaseName = highestBloodItemName.substring(0, dotIndex);
     1364                }
     1365                // Remove blood item item prefix
     1366                int prefixLength = bloodItemPrefix.length();
     1367                String highestBloodItemNumString = highestBloodItemBaseName.substring(prefixLength);
     1368                // Remove leading zeroes in blood item number
     1369                while (highestBloodItemNumString.indexOf("0") == 0)
     1370                {
     1371                  highestBloodItemNumString = highestBloodItemNumString.substring(1);
     1372                }
     1373                if (highestBloodItemNumString.equals(""))
     1374                {
     1375                  highestBloodItemNumString = "0";
     1376                }
     1377                // Get highest current blood item number as integer
     1378                int highestBloodItemNumber = Integer.parseUnsignedInt(highestBloodItemNumString);
     1379                // Get new blood item number
     1380                int newBloodItemNumber = highestBloodItemNumber + 1;
     1381                // Get new blood item number string with leading zeroes
     1382                String newBloodItemNumString = "" + newBloodItemNumber;
     1383                while (newBloodItemNumString.length() < sampleItemNumDigits)
     1384                {
     1385                  newBloodItemNumString = "0" + newBloodItemNumString;
     1386                }
     1387                // Get new blood item name
     1388                bloodItemName = bloodItemPrefix + newBloodItemNumString + ".1";
     1389                //bloodItemName = bloodItemBaseName + "." + bloodItemNumber;
     1390                // Update highest blood item number
     1391                highestBloodItemName = bloodItemName;
     1392              }
     1393
     1394              // Update hash map with highest blood name for case
     1395              caseNameHighestBloodNameHashMap.put(caseName, bloodItemName);
     1396
     1397              // Register blood sample
     1398              //
     1399              String itemName = bloodItemName;
     1400              Sample blood = Sample.getNew(dc);
     1401              blood.setItemSubtype(Subtype.BLOOD.load(dc));
     1402              blood.setName(itemName);
     1403              dc.saveItem(blood);
     1404              // !IMPORTANT - The sampling date must be set here and as an 'SamplingDateTime' annotation
     1405              //BioMaterialEvent creationEvent = blood.getCreationEvent();
     1406              //creationEvent.setEventDate(samplingDate);
     1407
     1408              // Update blood item with consent for case
     1409              if (theCase != null)
     1410              {
     1411                Consent.copyConsentAnnotations(dc, theCase.getSample(), blood);
     1412              }
     1413           
     1414              // Update the blood annotations
     1415              Annotationtype.CASE_ID.setAnnotationValue(dc, blood, caseName);
     1416              Annotationtype.TUBE_LABEL.setAnnotationValue(dc, blood, tubeLabel);
     1417              if (samplingDate != null) Annotationtype.SAMPLING_DATE.setAnnotationValue(dc, blood, samplingDate);
     1418              if (arrivalDate != null) Annotationtype.ARRIVAL_DATE.setAnnotationValue(dc, blood, arrivalDate);
     1419
     1420              // Update Case annotations
     1421              if (wholeBlood != null) Annotationtype.WHOLE_BLOOD.setAnnotationValue(dc, theCase.getSample(), wholeBlood);
     1422         
     1423              // Get biowell if it is specified for this tube
     1424              String boxType = "Blood";
     1425              BioWell well = fetchBioWell(dc, jsonBloodItem, bioPlateNamePlateHashMap, boxType);
     1426              // Set storage space for whole blood, if former is valid
     1427              if (well != null)
     1428              {
     1429                blood.setBioWell(well);             
     1430              }
     1431              numUpdatedBloodTubes++;
     1432              jsonMessages.add("Whole blood item '" + blood.getName() + "' [tube label = " + tubeLabel + " case = " + caseName + "] created successfully.");
     1433            }
     1434          }
     1435          jsonMessages.add(numUpdatedBloodTubes + " blood tube(s) updated.");
     1436        }
     1437        dc.commit();
     1438        json.put("messages", jsonMessages);
     1439        CounterService.getInstance().setForceCount();
     1440      }
    12401441    }
    12411442    catch (Throwable t)
     
    13071508    if (highestBloodItemName != null)
    13081509    {
     1510      // Get base name (name without suffix) for highest blood item for case
     1511      String highestBloodItemBaseName = null;
     1512      int dotIndex = highestBloodItemName.indexOf(".");
     1513      if (dotIndex > -1)
     1514      {
     1515        highestBloodItemBaseName = highestBloodItemName.substring(0, dotIndex);
     1516      }
    13091517      // Remove blood item item prefix
    13101518      int prefixLength = bloodItemPrefix.length();
    1311       String highestBloodItemNumString = highestBloodItemName.substring(prefixLength);
     1519      String highestBloodItemNumString = highestBloodItemBaseName.substring(prefixLength);
    13121520      // Remove leading zeroes in blood item number
    13131521      while (highestBloodItemNumString.indexOf("0") == 0)
     
    13271535    }
    13281536    // Get new blood item name
    1329     String newBloodItemName = bloodItemPrefix + newBloodItemNumString;
     1537    String newBloodItemName = bloodItemPrefix + newBloodItemNumString + ".1";
    13301538    return newBloodItemName;
    13311539  }
Note: See TracChangeset for help on using the changeset viewer.