/** * The contents of this file are subject to the Mozilla Public License * Version 1.1 (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.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations under * the License. * * The Original Code is OpenELIS code. * * Copyright (C) The Minnesota Department of Health. All Rights Reserved. * * Contributor(s): CIRG, University of Washington, Seattle WA. */ package us.mn.state.health.lims.common.util; import org.apache.commons.validator.GenericValidator; import us.mn.state.health.lims.common.log.LogEvent; import us.mn.state.health.lims.common.util.ConfigurationProperties.Property; import java.io.InputStream; import java.sql.Date; import java.text.DateFormat; import java.util.*; /** * This class represents the configuration properties of the application * */ public class SystemConfiguration { private static String propertyFile = "/SystemConfiguration.properties"; private static SystemConfiguration config = null; private List<LocaleChangeListener> localChangeListeners = new ArrayList<LocaleChangeListener>(); private Properties properties = null; private Map<String, Locale> localePropertyToLocaleMap = new HashMap<String, Locale>(); private SystemConfiguration() { InputStream propertyStream = null; try { propertyStream = this.getClass().getResourceAsStream(propertyFile); // Now load a java.util.Properties object with the properties properties = new Properties(); properties.load(propertyStream); } catch (Exception e) { //bugzilla 2154 LogEvent.logError("SystemConfiguration","Constructor",e.toString()); } finally { if (null != propertyStream) { try { propertyStream.close(); propertyStream = null; } catch (Exception e) { //bugzilla 2154 LogEvent.logError("SystemConfiguration","Constructor final",e.toString()); } } } } public static SystemConfiguration getInstance() { if (config == null) { synchronized (SystemConfiguration.class) { if (config == null) { config = new SystemConfiguration(); } } } return config; } public void addLocalChangeListener(LocaleChangeListener listener){ localChangeListeners.add(listener); } public int getDefaultPageSize() { String pageSize = properties.getProperty("page.defaultPageSize"); if (pageSize != null) { return Integer.parseInt(pageSize); } //bugzilla 1409 return 20; } //bugzilla 1742 public int getDefaultTreePageSize() { String pageSize = properties.getProperty("page.tree.defaultPageSize"); if (pageSize != null) { return Integer.parseInt(pageSize); } return 10; } //bugzilla 1742 public int getDefaultPaginatedNodeChildCount() { String count = properties.getProperty("page.tree.paginatednode.child.count"); if (count != null) { return Integer.parseInt(count); } return 32; } public Locale getDefaultLocale() { return getLocaleByLocalString( ConfigurationProperties.getInstance().getPropertyValue(Property.DEFAULT_LANG_LOCALE) ); } public Locale getLocaleByLocalString( String localeString){ Locale locale = localePropertyToLocaleMap.get(localeString); if( locale == null){ if (localeString != null && localeString.length() == 5) { locale = new Locale(localeString.substring(0, 2), localeString.substring(3)); localePropertyToLocaleMap.put(localeString, locale); } } return locale == null ? Locale.US : locale; } public void setDefaultLocale( String locale ){ ConfigurationProperties.getInstance().setPropertyValue(Property.DEFAULT_LANG_LOCALE, locale); for( LocaleChangeListener listener : localChangeListeners){ listener.localeChanged(locale); } } public String getDefaultEncoding() { String encodingString = properties.getProperty("default.encoding"); if (encodingString != null) { return encodingString; } return "Cp1252"; } public String getDefaultApplicationName() { String applicationNameString = properties.getProperty("default.application.name"); if (applicationNameString != null) { return applicationNameString; } //bugzilla 1995 return "OpenELIS"; } public String getDefaultIdSeparator() { String def = properties.getProperty("default.idSeparator"); if (def != null) { return def; } return ";"; } public String getDefaultTextSeparator() { String def = properties.getProperty("default.textSeparator"); if (def != null) { return def; } return "|;|"; } public String getDictionaryType() { String dictType = properties.getProperty("dictionaryType"); if (dictType != null) { return dictType; } return "D"; } public String getTiterType() { String titerType = properties.getProperty("titerType"); if (titerType != null) { return titerType; } return "T"; } public String getAnalyteTypeRequired() { String analyteTypeRequired = properties.getProperty("analyteTypeRequired"); if (analyteTypeRequired != null) { return analyteTypeRequired; } return "R"; } public String getAnalyteTypeNotRequired() { String analyteTypeNotRequired = properties.getProperty("analyteTypeNotRequired"); if (analyteTypeNotRequired != null) { return analyteTypeNotRequired; } return "N"; } public String getNumericType() { String numericType = properties.getProperty("numericType"); if (numericType != null) { return numericType; } return "N"; } //============================================================== public String getQuickEntryDefaultReferredCultureFlag() { String def = properties.getProperty("quickEntry.default.sample.referredCultureFlag"); if (def != null) { return def; } return "S"; } public String getQuickEntryDefaultStickerReceivedFlag() { String def = properties.getProperty("quickEntry.default.sample.stickerReceivedFlag"); if (def != null) { return def; } return "N"; } public String getQuickEntryDefaultNextItemSequence() { String def = properties.getProperty("quickEntry.default.sample.nextItemSequence"); if (def != null) { return def; } return "1"; } public String getQuickEntryDefaultRevision() { String def = properties.getProperty("quickEntry.default.sample.revision"); if (def != null) { return def; } return "0"; } public String getQuickEntryDefaultCollectionTimeForDisplay() { String def = properties.getProperty("quickEntry.default.sample.collectionTimeForDisplay"); if (def != null) { return def; } return "00:00"; } //============================================================== public String getHumanSampleOneDefaultReferredCultureFlag() { String def = properties .getProperty("humanSampleOne.default.sample.referredCultureFlag"); if (def != null) { return def; } //bugzilla 1754 - blank is default return ""; } public String getHumanSampleOneDefaultStickerReceivedFlag() { String def = properties .getProperty("humanSampleOne.default.sample.stickerReceivedFlag"); if (def != null) { return def; } return "N"; } public String getHumanSampleOneDefaultNextItemSequence() { String def = properties .getProperty("humanSampleOne.default.sample.nextItemSequence"); if (def != null) { return def; } return "1"; } public String getHumanSampleOneDefaultRevision() { String def = properties .getProperty("humanSampleOne.default.sample.revision"); if (def != null) { return def; } return "0"; } public String getHumanSampleOneDefaultCollectionTimeForDisplay() { String def = properties .getProperty("humanSampleOne.default.sample.collectionTimeForDisplay"); if (def != null) { return def; } return "00:00"; } public String getHumanSampleOneDefaultPatientGender() { String def = properties .getProperty("humanSampleOne.default.patient.gender"); if (def != null) { return def; } return ""; } //bugzilla 1387 rename this method so more generic public String getHumanDomain() { String def = properties .getProperty("domain.human"); if (def != null) { return def; } return "H"; } //bugzilla 1387 rename this method so more generic public String getAnimalDomain() { String def = properties .getProperty("domain.animal"); if (def != null) { return def; } return "A"; } //bugzilla 1348 - analysis status for verification public String getAnalysisVerifiedStatus() { String def = properties .getProperty("analysis.status.verified"); if (def != null) { return def; } return "V"; } //bugzilla 1348 - analysis status for verification public String getAnalysisReadyToVerifyStatus() { String def = properties .getProperty("analysis.status.readytoverify"); if (def != null) { return def; } return ""; } //bugzilla - reports id public String getOpenReportsReportId(String key) { String def = properties .getProperty(key); if (def != null) { return def; } return ""; } //bugzilla - reports group public String getOpenReportsGroupId(String key) { String def = properties .getProperty(key); if (def != null) { return def; } return ""; } // bugzilla 1546 public String getSampleStatusType() { String def = properties .getProperty("sample.status"); if (def != null) { return def; } return ""; } public String getAnalysisStatusType() { String def = properties .getProperty("analysis.status"); if (def != null) { return def; } return ""; } //bugzilla 2380 public String getLabelPrinterName() { String printer = properties.getProperty("print.label.name"); if (printer != null) { return printer; } return ""; } public String getLabelNumberOfCopies(String key) { String numberOfCopies = properties.getProperty(key); if (numberOfCopies != null) { return numberOfCopies; } return "1"; } //bugzilla 2374 public String getMaxNumberOfLabels() { String maxNumberOfLabels = properties.getProperty("print.label.numeroflabels"); if (maxNumberOfLabels != null) { return maxNumberOfLabels; } return "100"; } public String getBarcodeHeight() { String height = properties.getProperty("print.label.barcode.height"); if (height != null) { return height; } return "44"; } public String getBarcodeWidth() { String width = properties.getProperty("print.label.barcode.width"); if (width != null) { return width; } return "330"; } public String getBarcodeResolution() { String res = properties.getProperty("print.label.barcode.resolution"); if (res != null) { return res; } return "300"; } //bugzilla 2592 public String getDefaultSampleLabel(String accessionNumber) { String prependBarcode = properties.getProperty("print.label.sample.prepend.barcode"); String prependHumanReadable = properties.getProperty("print.label.sample.prepend.humanreadable"); String postpend = properties.getProperty("print.label.sample.postpend"); if (prependBarcode != null && prependHumanReadable != null && postpend != null) { StringBuffer sb = new StringBuffer(); sb.append(prependBarcode).append(accessionNumber).append(prependHumanReadable).append(accessionNumber).append(postpend); return sb.toString(); } return ""; } public String getAnalysisStatusAssigned(){ String val = properties.getProperty("analysis.status.assigned"); if(val !=null) { return val; } return "1"; } //bugzilla 2300 public String getAnalysisStatusCanceled(){ String val = properties.getProperty("analysis.status.canceled"); if(val !=null) { return val; } return "2"; } public String getAnalysisStatusResultCompleted(){ String val = properties.getProperty("analysis.status.result.completed"); if(val !=null) { return val; } return "3"; } public String getAnalysisStatusReleased(){ String val = properties.getProperty("analysis.status.released"); if(val !=null) { return val; } return "4"; } public String getSampleStatusQuickEntryComplete(){ String val = properties.getProperty("sample.status.quick.entry.complete"); if(val !=null) { return val; } return "1"; } public String getSampleStatusEntry1Complete(){ String val = properties.getProperty("sample.status.entry.1.complete"); if(val !=null) { return val; } return "2"; } public String getSampleStatusEntry2Complete(){ String val = properties.getProperty("sample.status.entry.2.complete"); if(val !=null) { return val; } return "3"; } public String getSampleStatusReleased(){ String val = properties.getProperty("sample.status.released"); if(val !=null) { return val; } return "7"; } public String getSampleStatusLabelPrinted(){ String val = properties.getProperty("sample.status.label.printed"); if(val !=null) { return val; } return "8"; } public String getOpenReportsSwitchModulePath() { String res = properties.getProperty("openreports.switch.module.path"); if (res != null) { return res; } return "../../openreports"; } public String getResultReferenceTableId() { String refId = properties.getProperty("result.reference.table.id"); if (refId != null) { return refId; } return "21"; } //bugzilla 2028 public String getAnalysisQaEventActionReferenceTableId() { String refId = properties.getProperty("analysis.qaevent.action.reference.table.id"); if (refId != null) { return refId; } return "21"; } //bugzilla 2500 public String getSampleQaEventActionReferenceTableId() { String refId = properties.getProperty("sample.qaevent.action.reference.table.id"); if (refId != null) { return refId; } return "21"; } public String getNoteTypeInternal() { String internalType = properties.getProperty("note.type.internal"); if (internalType != null) { return internalType; } return "I"; } public String getNoteTypeExternal() { String externalType = properties.getProperty("note.type.external"); if (externalType != null) { return externalType; } return "I"; } public String getDefaultTransportMethodForXMLTransmission() { String transportMethod = properties.getProperty("default.transport.method"); if (transportMethod != null) { return transportMethod; } return "PHINMS_DEFINED_IN_SYS_CONFIG"; } public String getDefaultProcessingIdForXMLTransmission() { String processingId = properties.getProperty("default.transport.processing.id"); if (processingId != null) { return processingId; } return "T_DEFINED_IN_SYS_CONFIG"; } public String getDefaultTransmissionTextSeparator() { String separator = properties.getProperty("default.transport.text.separator"); if (separator != null) { return separator; } return "^_DEFINED_IN_SYS_CONFIG"; } public String getDefaultTransmissionCodeSystemType() { String codeSystemType = properties.getProperty("default.transport.code.system.type"); if (codeSystemType != null) { return codeSystemType; } return "L"; } public String getMdhUhlIdForXMLTransmission() { String uhlId = properties.getProperty("mdh.uhl.id"); if (uhlId != null) { return uhlId; } return "9999__DEFINED_IN_SYS_CONFIG"; } public String getMdhUniversalIdForXMLTransmission() { String universalId = properties.getProperty("mdh.universal.id"); if (universalId != null) { return universalId; } return "9999__DEFINED_IN_SYS_CONFIG"; } public String getMdhUniversalIdTypeForXMLTransmission() { String universalIdType = properties.getProperty("mdh.universal.id.type"); if (universalIdType != null) { return universalIdType; } return "9999__DEFINED_IN_SYS_CONFIG"; } public String getMdhPhoneNumberForXMLTransmission() { String phoneNumber = properties.getProperty("mdh.work.phone"); if (phoneNumber != null) { return phoneNumber; } return "800/999-9999_DEFINED_IN_SYS_CONFIG"; } public String getMdhOrganizationIdForXMLTransmission() { String orgId = properties.getProperty("mdh.organization.record.id"); if (orgId != null) { return orgId; } return "43"; } //bugzilla 2393 INFLUENZA XML public String getInfluenzaDefaultProcessingIdForXMLTransmission() { String processingId = properties.getProperty("default.transport.processing.id.influenza"); if (processingId != null) { return processingId; } return "T"; } //bugzilla 2393 public String getInfluenzaDefaultApplicationName() { String applicationNameString = properties.getProperty("default.application.name.influenza"); if (applicationNameString != null) { return applicationNameString; } //bugzilla 1995 return "MN OpenELIS Stage"; } //1742 openreports static ids (tests, projects etc.) public String getStaticIdByName(String name) { String testId = properties.getProperty(name); //System.out.println("SystemConfig getting test by name " + name); if (testId != null) { return testId; } return ""; } public String getDefaultDataSource() { String dsString = properties.getProperty("default.datasource"); if (dsString != null) { return dsString; } return "LimsDS"; } //bugzilla 2028 get qaevent code for quickentry sample type NOT GIVEN public String getQaEventCodeForRequestNoSampleType() { String string = properties.getProperty("qaeventcode.request.sourcemissing"); if (string != null) { return string; } return "RQNSO"; } //bugzilla 2028 get qaevent code for quickentry missing collection date public String getQaEventCodeForRequestNoCollectionDate() { String string = properties.getProperty("qaeventcode.request.collectiondatemissing"); if (string != null) { return string; } return "RQNCD"; } //bugzilla 2028 get qaevent code for quickentry submitter unknown public String getQaEventCodeForRequestUnknownSubmitter() { String string = properties.getProperty("qaeventcode.request.submitterunknown"); if (string != null) { return string; } return "RQNSNA"; } //bugzilla 2028 get unknownSubmitterNumber //bugzilla 2589 unknown submitter number is null now public String getUnknownSubmitterNumberForQaEvent() { String string = properties.getProperty("unknown.submitter.number"); if (string != null) { return string; } return ""; } //bugzilla 2028 get qaevent action code for quickentry sample type NOT GIVEN public String getQaEventActionCodeForRequestNoSampleType() { String string = properties.getProperty("qaeventactioncode.request.sourcemissing"); if (string != null) { return string; } return "RQSOC"; } //bugzilla 2028 get qaevent action code for quickentry missing collection date public String getQaEventActionCodeForRequestNoCollectionDate() { String string = properties.getProperty("qaeventactioncode.request.collectiondatemissing"); if (string != null) { return string; } return "CDC"; } //bugzilla 2028 get qaevent action code for quickentry submitter unknown public String getQaEventActionCodeForRequestUnknownSubmitter() { String string = properties.getProperty("qaeventactioncode.request.submitterunknown"); if (string != null) { return string; } return "SNAC"; } //bugzilla 2063 public String getQaEventDictionaryCategoryType() { String string = properties.getProperty("dictionary.category.qaevent.type"); if (string != null) { return string; } //bugzilla 2221 - we are now defining only exceptions to the rule return "Q"; } //bugzilla 2506 public String getQaEventDictionaryCategoryCategory() { String string = properties.getProperty("dictionary.category.qaevent.category"); if (string != null) { return string; } //bugzilla 2221 - we are now defining only exceptions to the rule return "QC"; } //User Profile public String getLoginUserPasswordExpiredDay() { String string = properties.getProperty("login.user.password.expired.day"); if (string != null) { return string; } return "30"; } public String getLoginUserChangePasswordAllowDay() { String string = properties.getProperty("login.user.change.password.allow.day"); if (string != null) { return string; } return "3"; } public String getLoginUserChangePasswordExpiredMonth() { String string = properties.getProperty("login.user.password.expired.month"); if (string != null) { return string; } return "1"; } //bugzilla 2286 password reminder days public String getLoginUserPasswordExpiredReminderDay() { String string = properties.getProperty("login.user.password.expired.reminder.day"); if (string != null) { return string; } return "15"; } //bugzilla 2286 account lock after 3 failed logins public String getLoginUserFailAttemptCount() { String string = properties.getProperty("login.fail.attempt.count"); if (string != null) { return string; } return "3"; } //bugzilla 2286 account unlock after 10 minutes public String getLoginUserAccountUnlockMinute() { String string = properties.getProperty("login.user.account.unlock.minute"); if (string != null) { return string; } return "10"; } //User Test Section public String getEnableUserTestSection() { String string = properties.getProperty("enable.user.test.section"); if (string != null) { return string; } return "Y"; } public String getAnalysisDefaultRevision() { String def = properties.getProperty("analysis.default.revision"); if (def != null) { return def; } return "0"; } //Encrypted PDF Path public String getEncryptedPdfPath() { String string = properties.getProperty("encrypted.pdf.path"); if (string != null) { return string; } return "/export/project/phl/scans"; } //Allow to view the encrypted pdf public String getEnabledSamplePdf() { String string = properties.getProperty("enable.sample.pdf"); if (string != null) { return string; } return "Y"; } //bugzilla 2528 public String getNewbornTestPanelName() { String string = properties.getProperty("newborn.testPanelName"); if (string != null) { return string; } return "NBS-Panel"; } public String getNewbornTypeOfSample() { String string = properties.getProperty("newborn.typeOfSample"); if (string != null) { return string; } return "DRIED BLOOD SPOT CARD"; } //bugzilla 2529, 2530 public String getNewbornDomain() { String string = properties.getProperty("domain.newborn"); if (string != null) { return string; } return "N"; } //for testing only to inject values public void setSiteCode( String siteCode){ properties.setProperty("sitecode", siteCode); } public String getProgramCodes() { String codes = properties.getProperty("programcodes"); return (codes == null ? "" : codes); } //for testing only to inject values public void setProgramCodes( String programCodes){ properties.setProperty("programcodes", programCodes); } public String getNewbornPatientRelation() { String string = properties.getProperty("newborn.patient.relation"); if (string != null) { return string; } return "M"; } //we are letting the date locale differ from the default locale. Not a good thing public Locale getDateLocale() { String localeString = ConfigurationProperties.getInstance().getPropertyValue(Property.DEFAULT_DATE_LOCALE); Locale locale = Locale.US; if (!GenericValidator.isBlankOrNull(localeString)) { String[] splitLocale = localeString.split("-"); if( splitLocale.length == 1){ //there is variation around separators splitLocale = localeString.split("_"); } switch (splitLocale.length) { case 1: { locale = new Locale(splitLocale[0]); break; } case 2: { locale = new Locale(splitLocale[0], splitLocale[1]); break; } case 3: { locale = new Locale(splitLocale[0], splitLocale[1], splitLocale[2]); break; } default: // no-op } } return locale; } public String getPatternForDateLocale(){ DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, getDateLocale()); // yyyy/mm/dd Date date = Date.valueOf("2000-01-02"); String pattern = dateFormat.format(date); pattern = pattern.replaceFirst("01", "MM"); pattern = pattern.replaceFirst("02", "DD"); pattern = pattern.replaceFirst("00", "YYYY"); return pattern; } public boolean errorsToScreen() { String id = properties.getProperty("errors.to.screen"); return id == null ? false : Boolean.valueOf(id.trim()); } public String getPermissionAgent(){ return properties.getProperty("permissions.agent", "USER").trim().toUpperCase(); } public long getSearchTimeLimit() { long limit = 20000L; String timeLimit = properties.getProperty("patient.search.time.limit.ms"); if( !GenericValidator.isBlankOrNull(timeLimit)){ try{ limit = Long.parseLong(timeLimit); }catch( NumberFormatException nfe){ LogEvent.logError("SystemConfiguration","getSearchTimeLimit()","Invalid SystemConfiguration format for 'patient.search.time.limit.ms'. Default used"); } } return limit; } public boolean useTestPatientGUID() { return "enable".equals(properties.getProperty("use.test.patient.guid", "disable")); } public void setProperty( String property, String value){ properties.setProperty(property, value); } }