[ 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)