in wagon-providers/wagon-ftp/src/main/java/org/apache/maven/wagon/providers/ftp/FtpWagon.java [462:562]
private void ftpRecursivePut(File sourceFile, String fileName) throws TransferFailedException {
final RepositoryPermissions permissions = repository.getPermissions();
fireTransferDebug("processing = " + sourceFile.getAbsolutePath() + " as " + fileName);
if (sourceFile.isDirectory()) {
if (!fileName.equals(".")) {
try {
// change directory if it already exists.
if (!ftp.changeWorkingDirectory(fileName)) {
// first, try to create it
if (makeFtpDirectoryRecursive(fileName, permissions)) {
if (!ftp.changeWorkingDirectory(fileName)) {
throw new TransferFailedException("Unable to change cwd on ftp server to " + fileName
+ " when processing " + sourceFile.getAbsolutePath());
}
} else {
throw new TransferFailedException("Unable to create directory " + fileName
+ " when processing " + sourceFile.getAbsolutePath());
}
}
} catch (IOException e) {
throw new TransferFailedException(
"IOException caught while processing path at " + sourceFile.getAbsolutePath(), e);
}
}
File[] files = sourceFile.listFiles();
if (files != null && files.length > 0) {
fireTransferDebug("listing children of = " + sourceFile.getAbsolutePath() + " found " + files.length);
// Directories first, then files. Let's go deep early.
for (File file : files) {
if (file.isDirectory()) {
ftpRecursivePut(file, file.getName());
}
}
for (File file : files) {
if (!file.isDirectory()) {
ftpRecursivePut(file, file.getName());
}
}
}
// Step back up a directory once we're done with the contents of this one.
try {
ftp.changeToParentDirectory();
} catch (IOException e) {
throw new TransferFailedException(
"IOException caught while attempting to step up to parent directory"
+ " after successfully processing "
+ sourceFile.getAbsolutePath(),
e);
}
} else {
// Oh how I hope and pray, in denial, but today I am still just a file.
FileInputStream sourceFileStream = null;
try {
sourceFileStream = new FileInputStream(sourceFile);
// It's a file. Upload it in the current directory.
if (ftp.storeFile(fileName, sourceFileStream)) {
if (permissions != null) {
// Process permissions; note that if we get errors or exceptions here, they are ignored.
// This appears to be a conscious decision, based on other parts of this code.
String group = permissions.getGroup();
if (group != null) {
try {
ftp.sendSiteCommand("CHGRP " + permissions.getGroup());
} catch (IOException e) {
// ignore
}
}
String mode = permissions.getFileMode();
if (mode != null) {
try {
ftp.sendSiteCommand("CHMOD " + permissions.getDirectoryMode());
} catch (IOException e) {
// ignore
}
}
}
} else {
String msg = "Cannot transfer resource: '" + sourceFile.getAbsolutePath()
+ "' FTP Server response: " + ftp.getReplyString();
throw new TransferFailedException(msg);
}
sourceFileStream.close();
sourceFileStream = null;
} catch (IOException e) {
throw new TransferFailedException(
"IOException caught while attempting to upload " + sourceFile.getAbsolutePath(), e);
} finally {
IOUtils.closeQuietly(sourceFileStream);
}
}
fireTransferDebug("completed = " + sourceFile.getAbsolutePath());
}