public FilePackageJsonSource(string fullPathToFile) {
            if (File.Exists(fullPathToFile)) {
                int retryInterval = 500;
                int attempts = 5;

                // populate _source with retries for recoverable errors.
                while (--attempts >= 0) {
                    try {
                        using (var fin = new FileStream(fullPathToFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                        using (var reader = new StreamReader(fin)) {
                            _source = new ReaderPackageJsonSource(reader);
                            break;
                        }
                    } catch (PackageJsonException pje) {
                        WrapExceptionAndRethrow(fullPathToFile, pje);
                    } catch (IOException) {
                        if (attempts <= 0) { throw; }
                    } catch (UnauthorizedAccessException) {
                        if (attempts <= 0) { throw; }
                    }

                    Thread.Sleep(retryInterval);
                    retryInterval *= 2; // exponential backoff
                }
            }
        }
        public FilePackageJsonSource(string fullPathToFile)
        {
            if (File.Exists(fullPathToFile))
            {
                int retryInterval = 500;
                int attempts      = 5;

                // populate _source with retries for recoverable errors.
                while (--attempts >= 0)
                {
                    try {
                        using (var fin = new FileStream(fullPathToFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                            using (var reader = new StreamReader(fin)) {
                                _source = new ReaderPackageJsonSource(reader);
                                break;
                            }
                    } catch (PackageJsonException pje) {
                        WrapExceptionAndRethrow(fullPathToFile, pje);
                    } catch (IOException) {
                        if (attempts <= 0)
                        {
                            throw;
                        }
                    } catch (UnauthorizedAccessException) {
                        if (attempts <= 0)
                        {
                            throw;
                        }
                    }

                    Thread.Sleep(retryInterval);
                    retryInterval *= 2; // exponential backoff
                }
            }
        }