/** Abort the current transfer */ private void abortTransfer() { // logger.debug("Will abort transfer and write: ", write); FtpFile file = null; FtpTransfer current = null; try { current = getExecutingFtpTransfer(); file = current.getFtpFile(); file.abortFile(); } catch (FtpNoTransferException e) { logger.warn("Abort problem", e); } catch (FtpNoFileException e) { } catch (CommandAbstractException e) { logger.warn("Abort problem", e); } if (current != null) { current.setStatus(false); } endDataConnection(); session.setReplyCode( ReplyCode.REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED, "Transfer aborted for " + (current == null ? "Unknown command" : current.toString())); if (current != null) { if (!FtpCommandCode.isListLikeCommand(current.getCommand())) { try { session.getBusinessHandler().afterTransferDoneBeforeAnswer(current); } catch (CommandAbstractException e) { session.setReplyCode(e); } } } finalizeExecution(); }
/** Finish correctly a transfer */ private void closeTransfer() { // logger.debug("Will close transfer and write: {}", write); FtpFile file = null; FtpTransfer current = null; try { current = getExecutingFtpTransfer(); file = current.getFtpFile(); file.closeFile(); } catch (FtpNoTransferException e) { logger.warn("Close problem", e); } catch (FtpNoFileException e) { } catch (CommandAbstractException e) { logger.warn("Close problem", e); } if (current != null) { current.setStatus(true); } if (session.getDataConn().isStreamFile()) { endDataConnection(); } session.setReplyCode( ReplyCode.REPLY_226_CLOSING_DATA_CONNECTION, "Transfer complete for " + (current == null ? "Unknown command" : current.toString())); if (current != null) { if (!FtpCommandCode.isListLikeCommand(current.getCommand())) { try { session.getBusinessHandler().afterTransferDoneBeforeAnswer(current); } catch (CommandAbstractException e) { session.setReplyCode(e); } } else { // Special wait to prevent fast LIST following by STOR or RETR command try { Thread.sleep(FtpInternalConfiguration.RETRYINMS); } catch (InterruptedException e) { } } } finalizeExecution(); }
/** * Called when a transfer is finished from setEndOfTransfer * * @return True if it was already called before * @throws FtpNoTransferException */ private boolean checkFtpTransferStatus() throws FtpNoTransferException { if (isCheckAlreadyCalled) { logger.warn("Check: ALREADY CALLED"); return true; } if (isExecutingCommandFinished) { // already done logger.warn("Check: already Finished"); if (commandFinishing != null) { commandFinishing.cancel(); } throw new FtpNoTransferException("No transfer running"); } if (!isDataNetworkHandlerReady) { // already done logger.warn("Check: already DNH not ready"); throw new FtpNoTransferException("No connection"); } isCheckAlreadyCalled = true; FtpTransfer executedTransfer = getExecutingFtpTransfer(); // logger.debug("Check: command {}", executedTransfer.getCommand()); // DNH is ready and Transfer is running if (FtpCommandCode.isListLikeCommand(executedTransfer.getCommand())) { if (executedTransfer.getStatus()) { // Special status for List Like command // logger.debug("Check: List OK"); closeTransfer(); return false; } // logger.debug("Check: List Ko"); abortTransfer(); return false; } else if (FtpCommandCode.isRetrLikeCommand(executedTransfer.getCommand())) { FtpFile file = null; try { file = executedTransfer.getFtpFile(); } catch (FtpNoFileException e) { // logger.debug("Check: Retr no FtpFile for Retr"); abortTransfer(); return false; } try { if (file.isInReading()) { logger.debug("Check: Retr FtpFile still in reading KO"); abortTransfer(); } else { logger.debug("Check: Retr FtpFile no more in reading OK"); closeTransfer(); } } catch (CommandAbstractException e) { logger.warn("Retr Test is in Reading problem", e); closeTransfer(); } return false; } else if (FtpCommandCode.isStoreLikeCommand(executedTransfer.getCommand())) { // logger.debug("Check: Store OK"); closeTransfer(); return false; } else { logger.warn("Check: Unknown command"); abortTransfer(); } return false; }
/** * @return True if the current FtpTransfer is a Retrieve like transfer * @throws FtpNoTransferException * @throws CommandAbstractException * @throws FtpNoFileException */ private boolean isExecutingRetrLikeTransfer() throws FtpNoTransferException, CommandAbstractException, FtpNoFileException { return FtpCommandCode.isRetrLikeCommand(getExecutingFtpTransfer().getCommand()) && getExecutingFtpTransfer().getFtpFile().isInReading(); }