protected void buildReadPaths(org.w3c.dom.Node dataFileStoreNode)
        {
            javax.xml.xpath.XPathFactory pathFactory = javax.xml.xpath.XPathFactory.newInstance();
            javax.xml.xpath.XPath        pathFinder  = pathFactory.newXPath();

            try
            {
                org.w3c.dom.NodeList locationNodes = (org.w3c.dom.NodeList)pathFinder.evaluate(
                    "/dataFileStore/readLocations/location",
                    dataFileStoreNode.getFirstChild(),
                    javax.xml.xpath.XPathConstants.NODESET);
                for (int i = 0; i < locationNodes.getLength(); i++)
                {
                    org.w3c.dom.Node location       = locationNodes.item(i);
                    String           prop           = pathFinder.evaluate("@property", location);
                    String           wwDir          = pathFinder.evaluate("@wwDir", location);
                    String           append         = pathFinder.evaluate("@append", location);
                    String           isInstall      = pathFinder.evaluate("@isInstall", location);
                    String           isMarkWhenUsed = pathFinder.evaluate("@isMarkWhenUsed", location);

                    String path = buildLocationPath(prop, append, wwDir);
                    if (path == null)
                    {
                        Logging.logger().log(Level.WARNING, "FileStore.LocationInvalid",
                                             prop != null ? prop : Logging.getMessage("generic.Unknown"));
                        continue;
                    }

                    StoreLocation oldStore = this.storeLocationFor(path);
                    if (oldStore != null) // filter out duplicates
                    {
                        continue;
                    }

                    // Even paths that don't exist or are otherwise problematic are added to the list because they may
                    // become readable during the session. E.g., removable media. So add them to the search list.

                    java.io.File pathFile = new java.io.File(path);
                    if (pathFile.exists() && !pathFile.isDirectory())
                    {
                        Logging.logger().log(Level.WARNING, "FileStore.LocationIsFile", pathFile.getPath());
                    }

                    bool          pathIsInstall = isInstall != null && (isInstall.contains("t") || isInstall.contains("T"));
                    StoreLocation newStore      = new StoreLocation(pathFile, pathIsInstall);

                    // If the input parameter "markWhenUsed" is null or empty, then the StoreLocation should keep its
                    // default value. Otherwise the store location value is set to true when the input parameter contains
                    // "t", and is set to false otherwise.
                    if (isMarkWhenUsed != null && isMarkWhenUsed.length() > 0)
                    {
                        newStore.setMarkWhenUsed(isMarkWhenUsed.toLowerCase().contains("t"));
                    }

                    this.readLocations.add(newStore);
                }
            }
            catch (javax.xml.xpath.XPathExpressionException e)
            {
                String message = Logging.getMessage("FileStore.ExceptionReadingConfigurationFile");
                Logging.logger().severe(message);
                throw new IllegalStateException(message, e);
            }
        }