/**
   * Gets the default locale specified as a global property.
   *
   * @return default locale object.
   * @since 1.5
   * @should not return null if global property does not exist
   * @should not fail with empty global property value
   * @should not fail with bogus global property value
   * @should return locale object for global property
   * @should not cache locale when session is not open
   */
  public static Locale getDefaultLocale() {
    if (defaultLocaleCache == null) {
      if (Context.isSessionOpen()) {
        try {
          String locale =
              Context.getAdministrationService()
                  .getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_DEFAULT_LOCALE);

          if (StringUtils.hasLength(locale)) {
            try {
              defaultLocaleCache = fromSpecification(locale);
            } catch (Exception t) {
              log.warn("Unable to parse default locale global property value: " + locale, t);
            }
          }
        } catch (Exception e) {
          // swallow most of the stack trace for most users
          log.warn("Unable to get locale global property value. " + e.getMessage());
          log.trace("Unable to get locale global property value", e);
        }

        // if we weren't able to load the locale from the global property,
        // use the default one
        if (defaultLocaleCache == null)
          defaultLocaleCache =
              fromSpecification(OpenmrsConstants.GLOBAL_PROPERTY_DEFAULT_LOCALE_DEFAULT_VALUE);
      } else {
        // if session is not open, return the default locale without caching
        return fromSpecification(OpenmrsConstants.GLOBAL_PROPERTY_DEFAULT_LOCALE_DEFAULT_VALUE);
      }
    }

    return defaultLocaleCache;
  }
  /**
   * called before @BeforeTransaction methods
   *
   * @see
   *     org.springframework.test.context.support.AbstractTestExecutionListener#prepareTestInstance(org.springframework.test.context.TestContext)
   */
  @Override
  public void prepareTestInstance(TestContext testContext) throws Exception {
    StartModule startModuleAnnotation = testContext.getTestClass().getAnnotation(StartModule.class);

    // if the developer listed some modules with the @StartModule annotation on the class
    if (startModuleAnnotation != null) {

      if (!lastClassRun.equals(testContext.getTestClass().getSimpleName())) {
        // mark this with our class so that the services are only restarted once
        lastClassRun = testContext.getTestClass().getSimpleName();

        if (!Context.isSessionOpen()) Context.openSession();

        // load the omods that the dev defined for this class
        String modulesToLoad = StringUtils.join(startModuleAnnotation.value(), " ");

        Properties props = BaseContextSensitiveTest.runtimeProperties;
        props.setProperty(ModuleConstants.RUNTIMEPROPERTY_MODULE_LIST_TO_LOAD, modulesToLoad);
        try {
          ModuleUtil.startup(props);
        } catch (Exception e) {
          System.out.println("Error while starting modules: ");
          e.printStackTrace(System.out);
          throw e;
        }
        Assert.assertTrue(
            "Some of the modules did not start successfully for "
                + testContext.getTestClass().getSimpleName()
                + ". Only "
                + ModuleFactory.getStartedModules().size()
                + " modules started instead of "
                + startModuleAnnotation.value().length,
            startModuleAnnotation.value().length <= ModuleFactory.getStartedModules().size());

        /*
         * Refresh spring so the Services are recreated (aka serializer gets put into the SerializationService)
         * To do this, wrap the applicationContext from the testContext into a GenericApplicationContext, allowing
         * loading beans from moduleApplicationContext into it and then calling ctx.refresh()
         * This approach ensures that the application context remains consistent
         */
        GenericApplicationContext ctx =
            new GenericApplicationContext(testContext.getApplicationContext());
        XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
        xmlReader.loadBeanDefinitions(new ClassPathResource("moduleApplicationContext.xml"));
        ctx.refresh();

        // session is closed by the test framework
        // Context.closeSession();
      }
    }
  }
  /**
   * Gets the default locale specified as a global property.
   *
   * @return default locale object.
   * @since 1.5
   * @should not return null if global property does not exist
   * @should not fail with empty global property value
   * @should not fail with bogus global property value
   * @should return locale object for global property
   */
  public static Locale getDefaultLocale() {
    if (Context.isSessionOpen()) {
      try {
        String locale =
            Context.getAdministrationService()
                .getGlobalProperty(OpenmrsConstants.GLOBAL_PROPERTY_DEFAULT_LOCALE);

        if (StringUtils.hasLength(locale)) {
          try {
            return fromSpecification(locale);
          } catch (Exception t) {
            log.warn("Unable to parse default locale global property value: " + locale, t);
          }
        }
      } catch (Throwable t) {
        // swallow most of the stack trace for most users
        log.warn("Unable to get locale global property value. " + t.getMessage());
        log.trace("Unable to get locale global property value", t);
      }
    }

    return fromSpecification(OpenmrsConstants.GLOBAL_PROPERTY_DEFAULT_LOCALE_DEFAULT_VALUE);
  }
 public boolean isSessionOpen() {
   return Context.isSessionOpen();
 }