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");
}