public function update()
    {
        $downloader = new Downloader();
        $content = $downloader->downloadContent(self::DOWNLOAD_URI);

        $uriPicker = new FallbackURIPicker();
        $path = $uriPicker->pickURI($content);

        if (strlen($path) > 0 && $path{0} != "/") {
            $path = sprintf("/%s/%s", dirname(self::DOWNLOAD_URI), $path);

        }
        $pathParts = explode('/', $path);
        foreach ($pathParts as $i => $part) {
            switch ($part) {
                case '..':
                    unset($pathParts[$i-1]);
                    // fall-through as the current part ("..") should be removed as well.

                case '.':
                    unset($pathParts[$i]);
                    break;
            }

        }
        $path = implode('/', $pathParts);
        $urlParts = parse_url(self::DOWNLOAD_URI);
        $url = sprintf("%s://%s%s", $urlParts["scheme"], $urlParts["host"], $path);

        // download file
        $file = $downloader->downloadFile($url);

        // Validate file format.
        $validator = new FileValidator();
        $validator->validate($file);

        // blz_20100308.txt is not sorted.
        $parser     = new FileParser($file);
        $lastBankID = $parser->getBankID($parser->getLines());
        if ($lastBankID < 80000000) {
            $this->sortFile($file);

        }

        $this->fileUtil->safeRename($file, $this->parser->getFile());
        chmod($this->parser->getFile(), 0644);
    }