extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/MeludiConfiguration.java

Code
Comments
Other
Rev Date Author Line
4142 30 Sep 16 olle 1 package net.sf.basedb.meludi;
4142 30 Sep 16 olle 2
4142 30 Sep 16 olle 3 import java.net.URL;
4142 30 Sep 16 olle 4 import java.util.ArrayList;
4722 29 Mar 18 olle 5 import java.util.HashMap;
4142 30 Sep 16 olle 6 import java.util.List;
4142 30 Sep 16 olle 7
4142 30 Sep 16 olle 8 import org.jdom2.Document;
4142 30 Sep 16 olle 9 import org.jdom2.Element;
4142 30 Sep 16 olle 10 import org.jdom2.Namespace;
4142 30 Sep 16 olle 11 import org.slf4j.Logger;
4142 30 Sep 16 olle 12 import org.slf4j.LoggerFactory;
4142 30 Sep 16 olle 13
4142 30 Sep 16 olle 14 import net.sf.basedb.util.Values;
4142 30 Sep 16 olle 15 import net.sf.basedb.util.XmlUtil2;
4142 30 Sep 16 olle 16 import net.sf.basedb.meludi.dao.ProjectConfig;
4142 30 Sep 16 olle 17
4142 30 Sep 16 olle 18 public class MeludiConfiguration
4142 30 Sep 16 olle 19 {
4142 30 Sep 16 olle 20   private static final Logger log = LoggerFactory.getLogger(MeludiConfiguration.class);
4142 30 Sep 16 olle 21
4839 08 Jun 18 olle 22   public static final Integer REFERRAL_NUM_DIGITS_DEFAULT = 5;
4230 10 Nov 16 olle 23   public static final Integer SAMPLE_ITEM_NUM_DIGITS_DEFAULT = 5;
4901 10 Jul 18 olle 24   public static final Integer BLOOD_ITEM_NUM_DIGITS_DEFAULT = 5;
4901 10 Jul 18 olle 25   public static final Integer FFPE_BLOCK_ITEM_NUM_DIGITS_DEFAULT = 5;
4230 10 Nov 16 olle 26   public static final Integer STORAGE_BOX_NUM_DIGITS_DEFAULT = 4;
4822 23 May 18 olle 27   public static final Integer BLOOD_BOX_NUM_DIGITS_DEFAULT = 4;
5094 14 Nov 18 olle 28   public static final Integer HE_GLASS_BOX_NUM_DIGITS_DEFAULT = 4;
4230 10 Nov 16 olle 29   public static final Integer START_LIST_ITEM_NUM_DIGITS_DEFAULT = 5;
4230 10 Nov 16 olle 30   public static final Integer START_PLATE_ITEM_NUM_DIGITS_DEFAULT = 5;
4230 10 Nov 16 olle 31   public static final Integer PATIENT_ITEM_NUM_DIGITS_DEFAULT = 6;
4230 10 Nov 16 olle 32   public static final Integer LIBPREP_KIT_ITEM_NUM_DIGITS_DEFAULT = 3;
4248 22 Nov 16 olle 33   public static final Boolean EXTRACTS_FROM_FIRST_SPECIMEN_ONLY_DEFAULT = false;
4716 26 Mar 18 olle 34   public static final Boolean USES_SITE_PREFIX_DEFAULT = false;
4807 15 May 18 olle 35   public static final Boolean USES_REFERRAL_CREATION_DEFAULT = false;
4807 15 May 18 olle 36   public static final Boolean USES_SITE_SPECIFIC_REFERRAL_TEMPLATES_DEFAULT = false;
4213 08 Nov 16 olle 37   
4142 30 Sep 16 olle 38   private List<ProjectConfig> projectConfigList = null;
4142 30 Sep 16 olle 39   private String configFileName = "meludi-config.xml";
4142 30 Sep 16 olle 40
4142 30 Sep 16 olle 41   public List<ProjectConfig> getProjectConfigList()
4142 30 Sep 16 olle 42   {
4142 30 Sep 16 olle 43     return this.projectConfigList;
4142 30 Sep 16 olle 44   }
4142 30 Sep 16 olle 45
4142 30 Sep 16 olle 46   public void setProjectConfigList(List<ProjectConfig> projectConfigList)
4142 30 Sep 16 olle 47   {
4142 30 Sep 16 olle 48     this.projectConfigList = projectConfigList;
4142 30 Sep 16 olle 49   }
4142 30 Sep 16 olle 50
4142 30 Sep 16 olle 51   public MeludiConfiguration()
4142 30 Sep 16 olle 52   {
4142 30 Sep 16 olle 53     // Check if configuration has been loaded
4142 30 Sep 16 olle 54     if (getProjectConfigList() == null)
4142 30 Sep 16 olle 55     {
4142 30 Sep 16 olle 56       // Get configuration from configuration file
4142 30 Sep 16 olle 57       fetchConfiguration();
4142 30 Sep 16 olle 58     }
4142 30 Sep 16 olle 59   }
4142 30 Sep 16 olle 60
4142 30 Sep 16 olle 61   /**
4142 30 Sep 16 olle 62    * Reads configuration from configuration XML file
4142 30 Sep 16 olle 63    * meludi-config.xml and stores values in instance variables.
4142 30 Sep 16 olle 64    */
4142 30 Sep 16 olle 65   private void fetchConfiguration()
4142 30 Sep 16 olle 66   {
4142 30 Sep 16 olle 67     /*
4142 30 Sep 16 olle 68     Format of MeLuDI configuration file meludi-config.xml is:
4142 30 Sep 16 olle 69     <meludi>
4142 30 Sep 16 olle 70       <projects>
4142 30 Sep 16 olle 71         <project>
4142 30 Sep 16 olle 72           <name>...</name>
4839 08 Jun 18 olle 73           <referral-prefix>...</referral-prefix>
4839 08 Jun 18 olle 74           <referral-num-digits>...</referral-num-digits>
4142 30 Sep 16 olle 75           <sample-item-prefix>...</sample-item-prefix>
4213 08 Nov 16 olle 76           <sample-item-num-digits>...</sample-item-num-digits>
4867 21 Jun 18 olle 77           <blood-item-prefix>...</blood-item-prefix>
4901 10 Jul 18 olle 78           <blood-item-num-digits>...</blood-item-num-digits>
4901 10 Jul 18 olle 79           <ffpe-block-item-prefix>...</ffpe-block-item-prefix>
4901 10 Jul 18 olle 80           <ffpe-block-item-num-digits>...</ffpe-block-item-num-digits>
4184 27 Oct 16 olle 81           <storage-box-prefix>...</storage-box-prefix>
4213 08 Nov 16 olle 82           <storage-box-num-digits>...</storage-box-num-digits>
4822 23 May 18 olle 83           <blood-box-prefix>...</blood-box-prefix>
4822 23 May 18 olle 84           <blood-box-num-digits>...</blood-box-num-digits>
5094 14 Nov 18 olle 85           <he-glass-box-prefix>...</he-glass-box-prefix>
5094 14 Nov 18 olle 86           <he-glass-box-num-digits>...</he-glass-box-num-digits>
4142 30 Sep 16 olle 87           <start-list-item-prefix>...</start-list-item-prefix>
4213 08 Nov 16 olle 88           <start-list-item-num-digits>...</start-list-item-num-digits>
4142 30 Sep 16 olle 89           <start-plate-item-prefix>...</start-plate-item-prefix>
4213 08 Nov 16 olle 90           <start-plate-item-num-digits>...</start-plate-item-num-digits>
4142 30 Sep 16 olle 91           <patient-item-prefix>...</patient-item-prefix>
4213 08 Nov 16 olle 92           <patient-item-num-digits>...</patient-item-num-digits>
4184 27 Oct 16 olle 93           <library-preparation-kit-item-prefix>...</library-preparation-kit-item-prefix>
4227 10 Nov 16 olle 94           <library-preparation-kit-item-num-digits>...</library-preparation-kit-item-num-digits>
4716 26 Mar 18 olle 95           <uses-site-prefix>...</uses-site-prefix>
4722 29 Mar 18 olle 96           <site-prefix-hash-list>...</site-prefix-hash-list>
4807 15 May 18 olle 97           <uses-referral-creation>...</uses-referral-creation>
4807 15 May 18 olle 98           <uses-site-specific-referral-templates>...</uses-site-specific-referral-templates>
4160 18 Oct 16 olle 99           <project-focus-default>...</project-focus-default>
4160 18 Oct 16 olle 100           <specimen-type-default>...</specimen-type-default>
4184 27 Oct 16 olle 101           <specimen-input-type-default>...</specimen-input-type-default>
4248 22 Nov 16 olle 102           <extracts-from-first-specimen-only-default>...</extracts-from-first-specimen-only-default>
4249 23 Nov 16 olle 103           <deparaffinization-rna-volume-microliters-default>...</deparaffinization-rna-volume-microliters-default>
4249 23 Nov 16 olle 104           <deparaffinization-dna-volume-microliters-default>...</deparaffinization-dna-volume-microliters-default>
4142 30 Sep 16 olle 105         </project>
4142 30 Sep 16 olle 106         ...
4142 30 Sep 16 olle 107       </projects>
4142 30 Sep 16 olle 108     </meludi>
4142 30 Sep 16 olle 109     */
4142 30 Sep 16 olle 110       try
4142 30 Sep 16 olle 111       {
4142 30 Sep 16 olle 112         URL confFileUrl = MeludiConfiguration.class.getResource("/" + configFileName);
4142 30 Sep 16 olle 113         if (confFileUrl == null)
4142 30 Sep 16 olle 114         {
4142 30 Sep 16 olle 115             log.debug("Configuration file meludi-config.xml not found.");
4142 30 Sep 16 olle 116             throw new RuntimeException("Configuration file meludi-config.xml not found.");
4142 30 Sep 16 olle 117         }
4142 30 Sep 16 olle 118         URL dtdFile = null;
4142 30 Sep 16 olle 119         Document dom = XmlUtil2.getValidatedXml(confFileUrl, dtdFile);
4142 30 Sep 16 olle 120         Element root = dom.getRootElement();
4142 30 Sep 16 olle 121         Namespace ns = root.getNamespace();
4142 30 Sep 16 olle 122         Element parametersTag = root;
4142 30 Sep 16 olle 123         // Parse XML configuration file and store configuration values in instance variables
4142 30 Sep 16 olle 124         if (parametersTag != null)
4142 30 Sep 16 olle 125         {
4142 30 Sep 16 olle 126           List<ProjectConfig> projectConfigList = getProjectConfigList();
4142 30 Sep 16 olle 127           if (projectConfigList == null)
4142 30 Sep 16 olle 128           {
4142 30 Sep 16 olle 129             projectConfigList = new ArrayList<ProjectConfig>();
4142 30 Sep 16 olle 130           }
4142 30 Sep 16 olle 131             Element projectsTag = parametersTag.getChild("projects", ns);
4142 30 Sep 16 olle 132             if (projectsTag != null)
4142 30 Sep 16 olle 133             {
4142 30 Sep 16 olle 134               List<Element> projectTags = projectsTag.getChildren("project", ns);
4142 30 Sep 16 olle 135               log.debug("Found " + projectTags.size() + " project(s) in file: " + configFileName);
4142 30 Sep 16 olle 136               for (Element projectTag : projectTags)
4142 30 Sep 16 olle 137               {
4142 30 Sep 16 olle 138                 ProjectConfig projectConfig = new ProjectConfig();
4142 30 Sep 16 olle 139                 if (projectTag != null)
4142 30 Sep 16 olle 140                 {
4142 30 Sep 16 olle 141                      String nameConf = Values.getStringOrNull(projectTag.getChildText("name", ns));
4839 08 Jun 18 olle 142                     String referralPrefixConf = Values.getStringOrNull(projectTag.getChildText("referral-prefix", ns));
4839 08 Jun 18 olle 143                     Integer referralNumDigitsConf = Values.getInteger(projectTag.getChildText("referral-num-digits", ns), REFERRAL_NUM_DIGITS_DEFAULT);
4142 30 Sep 16 olle 144                     String sampleItemPrefixConf = Values.getStringOrNull(projectTag.getChildText("sample-item-prefix", ns));
4213 08 Nov 16 olle 145                     Integer sampleItemNumDigitsConf = Values.getInteger(projectTag.getChildText("sample-item-num-digits", ns), SAMPLE_ITEM_NUM_DIGITS_DEFAULT);
4867 21 Jun 18 olle 146                     String bloodItemPrefixConf = Values.getStringOrNull(projectTag.getChildText("blood-item-prefix", ns));
4901 10 Jul 18 olle 147                     Integer bloodItemNumDigitsConf = Values.getInteger(projectTag.getChildText("blood-item-num-digits", ns), BLOOD_ITEM_NUM_DIGITS_DEFAULT);
4901 10 Jul 18 olle 148                     String ffpeBlockItemPrefixConf = Values.getStringOrNull(projectTag.getChildText("ffpe-block-item-prefix", ns));
4901 10 Jul 18 olle 149                     Integer ffpeBlockItemNumDigitsConf = Values.getInteger(projectTag.getChildText("ffpe-block-item-num-digits", ns), FFPE_BLOCK_ITEM_NUM_DIGITS_DEFAULT);
4184 27 Oct 16 olle 150                     String storageBoxPrefixConf = Values.getStringOrNull(projectTag.getChildText("storage-box-prefix", ns));
4213 08 Nov 16 olle 151                     Integer storageBoxNumDigitsConf = Values.getInteger(projectTag.getChildText("storage-box-num-digits", ns), STORAGE_BOX_NUM_DIGITS_DEFAULT);
4142 30 Sep 16 olle 152                     String startListItemPrefixConf = Values.getStringOrNull(projectTag.getChildText("start-list-item-prefix", ns));
4213 08 Nov 16 olle 153                     Integer startListItemNumDigitsConf = Values.getInteger(projectTag.getChildText("start-list-item-num-digits", ns), START_LIST_ITEM_NUM_DIGITS_DEFAULT);
4142 30 Sep 16 olle 154                     String startPlateItemPrefixConf = Values.getStringOrNull(projectTag.getChildText("start-plate-item-prefix", ns));
4213 08 Nov 16 olle 155                     Integer startPlateItemNumDigitsConf = Values.getInteger(projectTag.getChildText("start-plate-item-num-digits", ns), START_PLATE_ITEM_NUM_DIGITS_DEFAULT);
4142 30 Sep 16 olle 156                     String patientItemPrefixConf = Values.getStringOrNull(projectTag.getChildText("patient-item-prefix", ns));
4213 08 Nov 16 olle 157                     Integer patientItemNumDigitsConf = Values.getInteger(projectTag.getChildText("patient-item-num-digits", ns), PATIENT_ITEM_NUM_DIGITS_DEFAULT);
4186 28 Oct 16 olle 158                     String libraryPreparationKitItemPrefixConf = Values.getStringOrNull(projectTag.getChildText("libprep-kit-item-prefix", ns));
4228 10 Nov 16 olle 159                     Integer libraryPreparationKitItemNumDigitsConf = Values.getInteger(projectTag.getChildText("libprep-kit-item-num-digits", ns), LIBPREP_KIT_ITEM_NUM_DIGITS_DEFAULT);
4716 26 Mar 18 olle 160                     Boolean usesSitePrefixConf = Values.getBoolean(projectTag.getChildText("uses-site-prefix", ns), USES_SITE_PREFIX_DEFAULT);
4722 29 Mar 18 olle 161                     String sitePrefixHashListConf = Values.getStringOrNull(projectTag.getChildText("site-prefix-hash-list", ns));
4807 15 May 18 olle 162                     Boolean usesReferralCreationConf = Values.getBoolean(projectTag.getChildText("uses-referral-creation", ns), USES_REFERRAL_CREATION_DEFAULT);
4807 15 May 18 olle 163                     Boolean usesSiteSpecificReferralTemplatesConf = Values.getBoolean(projectTag.getChildText("uses-site-specific-referral-templates", ns), USES_SITE_SPECIFIC_REFERRAL_TEMPLATES_DEFAULT);
4160 18 Oct 16 olle 164                     String projectFocusDefaultConf = Values.getStringOrNull(projectTag.getChildText("project-focus-default", ns));
4160 18 Oct 16 olle 165                     String specimenTypeDefaultConf = Values.getStringOrNull(projectTag.getChildText("specimen-type-default", ns));
4184 27 Oct 16 olle 166                     String specimenInputTypeDefaultConf = Values.getStringOrNull(projectTag.getChildText("specimen-input-type-default", ns));
4248 22 Nov 16 olle 167                     Boolean extractsFromFirstSpecimenOnlyDefaultConf = Values.getBoolean(projectTag.getChildText("extracts-from-first-specimen-only-default", ns), EXTRACTS_FROM_FIRST_SPECIMEN_ONLY_DEFAULT);
4249 23 Nov 16 olle 168                     Float deparaffinizationRnaVolumeMicroLitersDefaultConf = Values.getFloat(projectTag.getChildText("deparaffinization-rna-volume-microliters-default", ns));
4249 23 Nov 16 olle 169                     Float deparaffinizationDnaVolumeMicroLitersDefaultConf = Values.getFloat(projectTag.getChildText("deparaffinization-dna-volume-microliters-default", ns));
4142 30 Sep 16 olle 170                     // Add configuration values to instance variables
4142 30 Sep 16 olle 171                     projectConfig.setName(nameConf);
4839 08 Jun 18 olle 172                     projectConfig.setReferralPrefix(referralPrefixConf);
4839 08 Jun 18 olle 173                     projectConfig.setReferralNumDigits(referralNumDigitsConf);
4142 30 Sep 16 olle 174                     projectConfig.setSampleItemPrefix(sampleItemPrefixConf);
4213 08 Nov 16 olle 175                     projectConfig.setSampleItemNumDigits(sampleItemNumDigitsConf);
4867 21 Jun 18 olle 176                        projectConfig.setBloodItemPrefix(bloodItemPrefixConf);
4901 10 Jul 18 olle 177                     projectConfig.setBloodItemNumDigits(bloodItemNumDigitsConf);
4901 10 Jul 18 olle 178                        projectConfig.setFfpeBlockItemPrefix(ffpeBlockItemPrefixConf);
4901 10 Jul 18 olle 179                     projectConfig.setFfpeBlockItemNumDigits(ffpeBlockItemNumDigitsConf);
4184 27 Oct 16 olle 180                     projectConfig.setStorageBoxPrefix(storageBoxPrefixConf);
4213 08 Nov 16 olle 181                     projectConfig.setStorageBoxNumDigits(storageBoxNumDigitsConf);
4142 30 Sep 16 olle 182                     projectConfig.setStartListItemPrefix(startListItemPrefixConf);
4213 08 Nov 16 olle 183                     projectConfig.setStartListItemNumDigits(startListItemNumDigitsConf);
4142 30 Sep 16 olle 184                     projectConfig.setStartPlateItemPrefix(startPlateItemPrefixConf);
4213 08 Nov 16 olle 185                     projectConfig.setStartPlateItemNumDigits(startPlateItemNumDigitsConf);
4142 30 Sep 16 olle 186                     projectConfig.setPatientItemPrefix(patientItemPrefixConf);
4213 08 Nov 16 olle 187                     projectConfig.setPatientItemNumDigits(patientItemNumDigitsConf);
4184 27 Oct 16 olle 188                     projectConfig.setLibraryPreparationKitItemPrefix(libraryPreparationKitItemPrefixConf);
4227 10 Nov 16 olle 189                     projectConfig.setLibraryPreparationKitItemNumDigits(libraryPreparationKitItemNumDigitsConf);
4716 26 Mar 18 olle 190                     projectConfig.setUsesSitePrefix(usesSitePrefixConf);
4722 29 Mar 18 olle 191                     projectConfig.setSitePrefixHashList(sitePrefixHashListConf);
4807 15 May 18 olle 192                     projectConfig.setUsesReferralCreation(usesReferralCreationConf);
4807 15 May 18 olle 193                     projectConfig.setUsesSiteSpecificReferralTemplates(usesSiteSpecificReferralTemplatesConf);
4160 18 Oct 16 olle 194                     projectConfig.setProjectFocusDefault(projectFocusDefaultConf);
4160 18 Oct 16 olle 195                     projectConfig.setSpecimenTypeDefault(specimenTypeDefaultConf);
4184 27 Oct 16 olle 196                     projectConfig.setSpecimenInputTypeDefault(specimenInputTypeDefaultConf);
4248 22 Nov 16 olle 197                     projectConfig.setExtractsFromFirstSpecimenOnlyDefault(extractsFromFirstSpecimenOnlyDefaultConf);
4249 23 Nov 16 olle 198                     projectConfig.setDeparaffinizationRnaVolumeMicroLitersDefault(deparaffinizationRnaVolumeMicroLitersDefaultConf);
4249 23 Nov 16 olle 199                     projectConfig.setDeparaffinizationDnaVolumeMicroLitersDefault(deparaffinizationDnaVolumeMicroLitersDefaultConf);
4142 30 Sep 16 olle 200                     projectConfigList.add(projectConfig);
4142 30 Sep 16 olle 201                 }
4142 30 Sep 16 olle 202               }
4142 30 Sep 16 olle 203             }
4142 30 Sep 16 olle 204         // Save projectConfigList
4142 30 Sep 16 olle 205           setProjectConfigList(projectConfigList);
4142 30 Sep 16 olle 206         }
4142 30 Sep 16 olle 207       }
4142 30 Sep 16 olle 208       catch (Exception e)
4142 30 Sep 16 olle 209       {
4757 16 Apr 18 olle 210         log.debug("Exception thrown when accessing configuration file meludi-config.xml: " + e);
4757 16 Apr 18 olle 211         throw new RuntimeException("Exception thrown when accessing configuration file meludi-config.xml: ", e);
4142 30 Sep 16 olle 212       }
4142 30 Sep 16 olle 213   }
4142 30 Sep 16 olle 214
4142 30 Sep 16 olle 215   /**
4142 30 Sep 16 olle 216     Find the project configuration for the given project name. 
4142 30 Sep 16 olle 217     If no project configuration with the given name is found,
4142 30 Sep 16 olle 218     `null` is returned.
4142 30 Sep 16 olle 219
4142 30 Sep 16 olle 220     @param name String Name of the project to find configuration for.
4142 30 Sep 16 olle 221     @return A ProjectConfig object or `null`.
4142 30 Sep 16 olle 222    */
4142 30 Sep 16 olle 223   public ProjectConfig findByName(String name)
4142 30 Sep 16 olle 224   {
4142 30 Sep 16 olle 225     ProjectConfig p = null;
4142 30 Sep 16 olle 226     if (name != null)
4142 30 Sep 16 olle 227     {
4142 30 Sep 16 olle 228       for (ProjectConfig projectConfig: getProjectConfigList())
4142 30 Sep 16 olle 229       {
4142 30 Sep 16 olle 230         String projectName = projectConfig.getName();
4142 30 Sep 16 olle 231         if (name.equals(projectName))
4142 30 Sep 16 olle 232         {
4142 30 Sep 16 olle 233           p = projectConfig;
4142 30 Sep 16 olle 234           break;
4142 30 Sep 16 olle 235         }
4142 30 Sep 16 olle 236       }
4142 30 Sep 16 olle 237     }
4142 30 Sep 16 olle 238     return p;
4142 30 Sep 16 olle 239   }
4142 30 Sep 16 olle 240 }