[ 
https://issues.apache.org/jira/browse/CONFIGURATION-634?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15346760#comment-15346760
 ] 

Oliver Heger commented on CONFIGURATION-634:
--------------------------------------------

Thank you very much for the patch. I agree that the problem is caused by the 
fact that the base path is changed when the FileLocator gets resolved. Your 
patch solve this.

I am just a bit worried whether this change impacts other clients because the 
behavior of the getBasePath() method is now slightly changed. Maybe it would be 
safer to add another property to FileLocator that stores the 
_unresolvedBasePath_, i.e. the path that was explicitly set by the user before 
the _locate()_ method has been called. The locator strategy could then query 
this property to get the original base path while other client code calling 
_getBasePath()_ still sees the resolved path.

OTOH, I don't think that many clients will be affected by the change. The exact 
behavior of _getBasePath()_ was not documented to that detail.

WDYT?

> BasePath is incorrectly computed while init of CompositeConfiguration
> ---------------------------------------------------------------------
>
>                 Key: CONFIGURATION-634
>                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-634
>             Project: Commons Configuration
>          Issue Type: Bug
>    Affects Versions: 2.0
>         Environment: Windows Server 2008 R2
> Oracle JDK 1.8.0_92
>            Reporter: Raviteja Lokineni
>            Priority: Blocker
>         Attachments: CONF634.zip
>
>
> The base path should be just "app" instead of 
> {noformat}file:///C:/path/to/app{noformat} because of which the code is 
> trying to locate config.properties in the following path: 
> {noformat}C:\path\to\file:\C:\path\to\app\config.properties{noformat}
> In the below snippet basepath is good when handler.locate() runs but fails 
> when running handler.load()
> {code:java|title=org.apache.commons.configuration2.builder.FileLocatorUtils}
> protected void initFileHandler(FileHandler handler)
>             throws ConfigurationException
>     {
>         initEncoding(handler);
>         if (handler.isLocationDefined())
>         {
>             handler.locate();
>             handler.load();
>         }
>     }
> {code}
> If you would like to see the basepath being manipulated keep a debug point at 
> file.isFile() in the below snippet
> {code:java|title=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;
>     }
> {code}
> Snippet failing:
> {code:java}
> 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);
> }
> {code}
> Stacktrace:
> {noformat}
> 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]
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to