in modules/transports/core/vfs/src/main/java/org/apache/synapse/transport/vfs/VFSTransportSender.java [106:257]
public void sendMessage(MessageContext msgCtx, String targetAddress,
OutTransportInfo outTransportInfo) throws AxisFault {
if (waitForSynchronousResponse(msgCtx)) {
throw new AxisFault("The VFS transport doesn't support synchronous responses. " +
"Please use the appropriate (out only) message exchange pattern.");
}
VFSOutTransportInfo vfsOutInfo = null;
if (targetAddress != null) {
vfsOutInfo = new VFSOutTransportInfo(targetAddress, globalFileLockingFlag);
} else if (outTransportInfo != null && outTransportInfo instanceof VFSOutTransportInfo) {
vfsOutInfo = (VFSOutTransportInfo) outTransportInfo;
}
if (vfsOutInfo != null) {
FileObject replyFile = null;
try {
boolean wasError = true;
int retryCount = 0;
int maxRetryCount = vfsOutInfo.getMaxRetryCount();
long reconnectionTimeout = vfsOutInfo.getReconnectTimeout();
boolean append = vfsOutInfo.isAppend();
boolean isUseTempFile = vfsOutInfo.isUseTempFile();
String tempTargetFileName, actualTargetFileName = null;
while (wasError) {
try {
retryCount++;
replyFile = fsManager.resolveFile(vfsOutInfo.getOutFileURI());
if (replyFile == null) {
log.error("replyFile is null");
throw new FileSystemException("replyFile is null");
}
wasError = false;
} catch (FileSystemException e) {
log.error("cannot resolve replyFile", e);
if(maxRetryCount <= retryCount) {
handleException("cannot resolve replyFile repeatedly: "
+ e.getMessage(), e);
}
}
if (wasError) {
try {
Thread.sleep(reconnectionTimeout);
} catch (InterruptedException e2) {
Thread.currentThread().interrupt();
}
}
}
if (replyFile.exists()) {
if (replyFile.getType() == FileType.FOLDER) {
if (isUseTempFile) {
tempTargetFileName = VFSUtils.generateTempFileName();
actualTargetFileName = VFSUtils.getFileName(msgCtx, vfsOutInfo);
} else {
tempTargetFileName = VFSUtils.getFileName(msgCtx, vfsOutInfo);
}
// we need to write a file containing the message to this folder
FileObject responseFile = fsManager.resolveFile(replyFile, tempTargetFileName);
// if file locking is not disabled acquire the lock
// before uploading the file
if (vfsOutInfo.isFileLockingEnabled()) {
acquireLockForSending(responseFile, vfsOutInfo);
if (!responseFile.exists()) {
responseFile.createFile();
}
populateResponseFile(responseFile, msgCtx,append, true);
VFSUtils.releaseLock(fsManager, responseFile);
} else {
if (!responseFile.exists()) {
responseFile.createFile();
}
populateResponseFile(responseFile, msgCtx,append, false);
}
if (isUseTempFile) {
responseFile.moveTo(fsManager.resolveFile(replyFile, actualTargetFileName));
}
} else if (replyFile.getType() == FileType.FILE) {
if (isUseTempFile) {
tempTargetFileName = VFSUtils.generateTempFileName();
actualTargetFileName = replyFile.getURL().toString();
replyFile = getTempFileObject(fsManager, replyFile, tempTargetFileName);
}
// if file locking is not disabled acquire the lock
// before uploading the file
if (vfsOutInfo.isFileLockingEnabled()) {
acquireLockForSending(replyFile, vfsOutInfo);
populateResponseFile(replyFile, msgCtx, append, true);
VFSUtils.releaseLock(fsManager, replyFile);
} else {
populateResponseFile(replyFile, msgCtx, append, false);
}
if (isUseTempFile) {
replyFile.moveTo(fsManager.resolveFile(actualTargetFileName));
}
} else {
handleException("Unsupported reply file type : " + replyFile.getType() +
" for file : " + vfsOutInfo.getOutFileURI());
}
} else {
if (isUseTempFile) {
tempTargetFileName = VFSUtils.generateTempFileName();
actualTargetFileName = replyFile.getURL().toString();
replyFile = getTempFileObject(fsManager, replyFile, tempTargetFileName);
}
// if file locking is not disabled acquire the lock before uploading the file
if (vfsOutInfo.isFileLockingEnabled()) {
acquireLockForSending(replyFile, vfsOutInfo);
replyFile.createFile();
populateResponseFile(replyFile, msgCtx, append, true);
VFSUtils.releaseLock(fsManager, replyFile);
} else {
replyFile.createFile();
populateResponseFile(replyFile, msgCtx, append, false);
}
if (isUseTempFile) {
replyFile.moveTo(fsManager.resolveFile(actualTargetFileName));
}
}
} catch (FileSystemException e) {
handleException("Error resolving reply file : " +
vfsOutInfo.getOutFileURI(), e);
} finally {
if (replyFile != null) {
try {
if (fsManager!= null &&
replyFile.getName() != null && replyFile.getName().getScheme() != null &&
replyFile.getName().getScheme().startsWith("file") &&
replyFile.getParent() != null && replyFile.getParent().getFileSystem() != null) {
fsManager.closeFileSystem(replyFile.getParent().getFileSystem());
}
replyFile.close();
} catch (FileSystemException ignore) {}
}
}
} else {
handleException("Unable to determine out transport information to send message");
}
}