public void run()

in src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java [332:487]


        public void run() {
            //thread should end when we're no longer active
            while (reader == null && !terminated) {
                int atIndex = getFileURL().indexOf("@");
                int protocolIndex = getFileURL().indexOf("://");

                String loggableFileURL = atIndex > -1 ? getFileURL().substring(0, protocolIndex + "://".length()) + "username:password" + getFileURL().substring(atIndex) : getFileURL();
                logger.info("attempting to load file: " + loggableFileURL);
                try {
                    FileSystemManager fileSystemManager = VFS.getManager();
                    FileSystemOptions opts = new FileSystemOptions();
                    //if jsch not in classpath, can get NoClassDefFoundError here
                    try {
                        SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
                    } catch (NoClassDefFoundError ncdfe) {
                        logger.warn("JSch not on classpath!", ncdfe);
                    }

                    synchronized (fileSystemManager) {
                        fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
                        if (fileObject.exists()) {
                            reader = new InputStreamReader(fileObject.getContent().getInputStream(), "UTF-8");
                            //now that we have a reader, remove additional portions of the file url (sftp passwords, etc.)
                            //check to see if the name is a URLFileName..if so, set file name to not include username/pass
                            if (fileObject.getName() instanceof URLFileName) {
                                URLFileName urlFileName = (URLFileName) fileObject.getName();
                                setHost(urlFileName.getHostName());
                                setPath(urlFileName.getPath());
                            }
                        } else {
                            logger.info(loggableFileURL + " not available - will re-attempt to load after waiting " + MISSING_FILE_RETRY_MILLIS + " millis");
                        }
                    }
                } catch (FileSystemException fse) {
                    logger.info(loggableFileURL + " not available - may be due to incorrect credentials, but will re-attempt to load after waiting " + MISSING_FILE_RETRY_MILLIS + " millis", fse);
                } catch (UnsupportedEncodingException e) {
                    logger.info("UTF-8 not available", e);
                }
                if (reader == null) {
                    synchronized (this) {
                        try {
                            wait(MISSING_FILE_RETRY_MILLIS);
                        } catch (InterruptedException ie) {
                        }
                    }
                }
            }
            if (terminated) {
                //shut down while waiting for a file
                return;
            }
            initialize();
            logger.debug(getPath() + " exists");
            boolean readingFinished = false;

            do {
                long lastFilePointer = 0;
                long lastFileSize = 0;
                createPattern();
                try {
                    do {
                        FileSystemManager fileSystemManager = VFS.getManager();
                        FileSystemOptions opts = new FileSystemOptions();
                        //if jsch not in classpath, can get NoClassDefFoundError here
                        try {
                            SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
                        } catch (NoClassDefFoundError ncdfe) {
                            logger.warn("JSch not on classpath!", ncdfe);
                        }

                        //fileobject was created above, release it and construct a new one
                        synchronized (fileSystemManager) {
                            if (fileObject != null) {
                                fileObject.getFileSystem().getFileSystemManager().closeFileSystem(fileObject.getFileSystem());
                                fileObject.close();
                                fileObject = null;
                            }

                            fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
                        }

                        //file may not exist..
                        boolean fileLarger = false;
                        if (fileObject != null && fileObject.exists()) {
                            try {
                                //available in vfs as of 30 Mar 2006 - will load but not tail if not available
                                fileObject.refresh();
                            } catch (Error err) {
                                logger.info(getPath() + " - unable to refresh fileobject", err);
                            }

                            if (isGZip(getFileURL())) {
                                InputStream gzipStream = new GZIPInputStream(fileObject.getContent().getInputStream());
                                Reader decoder = new InputStreamReader(gzipStream,  "UTF-8");
                                BufferedReader bufferedReader = new BufferedReader(decoder);
                                process(bufferedReader);
                                readingFinished = true;
                            }
                            //could have been truncated or appended to (don't do anything if same size)
                            if (fileObject.getContent().getSize() < lastFileSize) {
                                reader = new InputStreamReader(fileObject.getContent().getInputStream(), "UTF-8");
                                logger.debug(getPath() + " was truncated");
                                lastFileSize = 0; //seek to beginning of file
                                lastFilePointer = 0;
                            } else if (fileObject.getContent().getSize() > lastFileSize) {
                                fileLarger = true;
                                RandomAccessContent rac = fileObject.getContent().getRandomAccessContent(RandomAccessMode.READ);
                                rac.seek(lastFilePointer);
                                reader = new InputStreamReader(rac.getInputStream(), "UTF-8");
                                BufferedReader bufferedReader = new BufferedReader(reader);
                                process(bufferedReader);
                                lastFilePointer = rac.getFilePointer();
                                lastFileSize = fileObject.getContent().getSize();
                                rac.close();
                            }
                            try {
                                if (reader != null) {
                                    reader.close();
                                    reader = null;
                                }
                            } catch (IOException ioe) {
                                logger.debug(getPath() + " - unable to close reader", ioe);
                            }
                        } else {
                            logger.info(getPath() + " - not available - will re-attempt to load after waiting " + getWaitMillis() + " millis");
                        }

                        try {
                            synchronized (this) {
                                wait(getWaitMillis());
                            }
                        } catch (InterruptedException ie) {
                        }
                        if (isTailing() && fileLarger && !terminated) {
                            logger.debug(getPath() + " - tailing file - file size: " + lastFileSize);
                        }
                    } while (isTailing() && !terminated && !readingFinished);
                } catch (IOException ioe) {
                    logger.info(getPath() + " - exception processing file", ioe);
                    try {
                        if (fileObject != null) {
                            fileObject.close();
                        }
                    } catch (FileSystemException e) {
                        logger.info(getPath() + " - exception processing file", e);
                    }
                    try {
                        synchronized (this) {
                            wait(getWaitMillis());
                        }
                    } catch (InterruptedException ie) {
                    }
                }
            } while (isAutoReconnect() && !terminated && !readingFinished);
            logger.debug(getPath() + " - processing complete");
        }