Uploaded image for project: 'Commons Configuration'
  1. Commons Configuration
  2. CONFIGURATION-634

BasePath is incorrectly computed while init of CompositeConfiguration

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.0
    • Fix Version/s: 2.1
    • Component/s: None
    • Labels:
      None
    • Environment:

      Windows Server 2008 R2
      Oracle JDK 1.8.0_92

    • Flags:
      Important

      Description

      The base path should be just "app" instead of

      file:///C:/path/to/app

      because of which the code is trying to locate config.properties in the following path:

      C:\path\to\file:\C:\path\to\app\config.properties

      In the below snippet basepath is good when handler.locate() runs but fails when running handler.load()

      org.apache.commons.configuration2.builder.FileLocatorUtils
      protected void initFileHandler(FileHandler handler)
                  throws ConfigurationException
          {
              initEncoding(handler);
              if (handler.isLocationDefined())
              {
                  handler.locate();
                  handler.load();
              }
          }
      

      If you would like to see the basepath being manipulated keep a debug point at file.isFile() in the below snippet

      org.apache.commons.configuration2.io.HomeDirectoryLocationStrategy
      public URL locate(FileSystem fileSystem, FileLocator locator)
          {
              if (StringUtils.isNotEmpty(locator.getFileName()))
              {
                  String basePath = fetchBasePath(locator);
                  File file =
                          FileLocatorUtils.constructFile(basePath,
                                  locator.getFileName());
                  if (file.isFile())
                  {
                      return FileLocatorUtils.convertFileToURL(file);
                  }
              }
      
              return null;
          }
      

      Snippet failing:

      CompositeConfiguration config = new CompositeConfiguration();
      config.addConfiguration(new SystemConfiguration());
      
      final FileBasedConfigurationBuilder<FileBasedConfiguration> homeDirConfigurationBuilder
              = new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class);
      final PropertiesBuilderParameters homeDirProperties = new Parameters().properties();
      final FileBasedConfigurationBuilder<FileBasedConfiguration> configurationBuilder
              = new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class);
      final PropertiesBuilderParameters properties = new Parameters().properties();
      
      FileBasedConfigurationBuilder<FileBasedConfiguration> builder1 = homeDirConfigurationBuilder.configure(
              homeDirProperties.setLocationStrategy(new HomeDirectoryLocationStrategy(true))
                      .setBasePath("app")
                      .setListDelimiterHandler(new DefaultListDelimiterHandler(','))
                      .setFileName("config.properties"));
      FileBasedConfigurationBuilder<FileBasedConfiguration> builder2 = configurationBuilder.configure(
              properties.setLocationStrategy(new ClasspathLocationStrategy())
                      .setListDelimiterHandler(new DefaultListDelimiterHandler(','))
                      .setFileName("default_config.properties"));
      try {
          // TODO Fails due to a bug in commons configuration FileLocatorUtils#createFullyInitializedLocatorFromURL
          config.addConfiguration(builder1.getConfiguration());
          config.addConfiguration(builder2.getConfiguration());
      } catch (ConfigurationException e) {
          log.warn(configMarker, "Failed to load the properties file, loading defaults", e);
      }
      

      Stacktrace:

      org.apache.commons.configuration2.ex.ConfigurationException: Could not locate: org.apache.commons.configuration2.io.FileLocator@353d0772[fileName=config.properties,basePath=file:///C:/path/to/app/,sourceURL=file:/C:/path/to/app/config.properties,encoding=ISO-8859-1,fileSystem=<null>,locationStrategy=org.apache.commons.configuration2.io.HomeDirectoryLocationStrategy@10e41621]
      	at org.apache.commons.configuration2.io.FileLocatorUtils.locateOrThrow(FileLocatorUtils.java:346) ~[commons-configuration2-2.0.jar:2.0]
      	at org.apache.commons.configuration2.io.FileHandler.load(FileHandler.java:972) ~[commons-configuration2-2.0.jar:2.0]
      	at org.apache.commons.configuration2.io.FileHandler.load(FileHandler.java:702) ~[commons-configuration2-2.0.jar:2.0]
      	at org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder.initFileHandler(FileBasedConfigurationBuilder.java:312) ~[commons-configuration2-2.0.jar:2.0]
      	at org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder.initResultInstance(FileBasedConfigurationBuilder.java:291) ~[commons-configuration2-2.0.jar:2.0]
      	at org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder.initResultInstance(FileBasedConfigurationBuilder.java:60) ~[commons-configuration2-2.0.jar:2.0]
      	at org.apache.commons.configuration2.builder.BasicConfigurationBuilder.createResult(BasicConfigurationBuilder.java:421) ~[commons-configuration2-2.0.jar:2.0]
      	at org.apache.commons.configuration2.builder.BasicConfigurationBuilder.getConfiguration(BasicConfigurationBuilder.java:285) ~[commons-configuration2-2.0.jar:2.0]
      

        Attachments

        1. CONF634.zip
          2 kB
          Raviteja Lokineni

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              bond_ Raviteja Lokineni
            • Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: