示例#1
0
 public FSDataInputStream open(Path file, int bufferSize) throws IOException {
   FTPClient client = connect();
   Path workDir = new Path(client.printWorkingDirectory());
   Path absolute = makeAbsolute(workDir, file);
   FileStatus fileStat = getFileStatus(client, absolute);
   if (fileStat.isDirectory()) {
     disconnect(client);
     throw new IOException("Path " + file + " is a directory.");
   }
   client.allocate(bufferSize);
   Path parent = absolute.getParent();
   // Change to parent directory on the
   // server. Only then can we read the
   // file
   // on the server by opening up an InputStream. As a side effect the working
   // directory on the server is changed to the parent directory of the file.
   // The FTP client connection is closed when close() is called on the
   // FSDataInputStream.
   client.changeWorkingDirectory(parent.toUri().getPath());
   InputStream is = client.retrieveFileStream(file.getName());
   FSDataInputStream fis = new FSDataInputStream(new FTPInputStream(is, client, statistics));
   if (!FTPReply.isPositivePreliminary(client.getReplyCode())) {
     // The ftpClient is an inconsistent state. Must close the stream
     // which in turn will logout and disconnect from FTP server
     fis.close();
     throw new IOException("Unable to open file: " + file + ", Aborting");
   }
   return fis;
 }
示例#2
0
  /**
   * A stream obtained via this call must be closed before using other APIs of this class or else
   * the invocation will block.
   */
  public FSDataOutputStream create(
      Path file,
      FsPermission permission,
      boolean overwrite,
      int bufferSize,
      short replication,
      long blockSize,
      Progressable progress)
      throws IOException {
    final FTPClient client = connect();
    Path workDir = new Path(client.printWorkingDirectory());
    Path absolute = makeAbsolute(workDir, file);
    if (exists(client, file)) {
      if (overwrite) {
        delete(client, file);
      } else {
        disconnect(client);
        throw new IOException("File already exists: " + file);
      }
    }

    Path parent = absolute.getParent();
    if (parent == null || !mkdirs(client, parent, FsPermission.getDefault())) {
      parent = (parent == null) ? new Path("/") : parent;
      disconnect(client);
      throw new IOException("create(): Mkdirs failed to create: " + parent);
    }
    client.allocate(bufferSize);
    // Change to parent directory on the server. Only then can we write to the
    // file on the server by opening up an OutputStream. As a side effect the
    // working directory on the server is changed to the parent directory of the
    // file. The FTP client connection is closed when close() is called on the
    // FSDataOutputStream.
    client.changeWorkingDirectory(parent.toUri().getPath());
    FSDataOutputStream fos =
        new FSDataOutputStream(client.storeFileStream(file.getName()), statistics) {

          public void close() throws IOException {
            super.close();
            if (!client.isConnected()) {
              throw new FTPException("Client not connected");
            }
            boolean cmdCompleted = client.completePendingCommand();
            disconnect(client);
            if (!cmdCompleted) {
              throw new FTPException(
                  "Could not complete transfer, Reply Code - " + client.getReplyCode());
            }
          }
        };
    if (!FTPReply.isPositivePreliminary(client.getReplyCode())) {
      // The ftpClient is an inconsistent state. Must close the stream
      // which in turn will logout and disconnect from FTP server
      fos.close();
      throw new IOException("Unable to create file: " + file + ", Aborting");
    }
    return fos;
  }
示例#3
0
  @Override
  public void send(Message message, TestContext context) {
    FtpMessage ftpMessage;
    if (message instanceof FtpMessage) {
      ftpMessage = (FtpMessage) message;
    } else {
      ftpMessage = new FtpMessage(message);
    }

    String correlationKeyName =
        getEndpointConfiguration().getCorrelator().getCorrelationKeyName(getName());
    String correlationKey =
        getEndpointConfiguration().getCorrelator().getCorrelationKey(ftpMessage);
    correlationManager.saveCorrelationKey(correlationKeyName, correlationKey, context);

    log.info(
        String.format(
            "Sending FTP message to: ftp://'%s:%s'",
            getEndpointConfiguration().getHost(), getEndpointConfiguration().getPort()));

    if (log.isDebugEnabled()) {
      log.debug("Message to be sent:\n" + ftpMessage.getPayload().toString());
    }

    try {
      connectAndLogin();

      int reply = ftpClient.sendCommand(ftpMessage.getCommand(), ftpMessage.getArguments());

      if (!FTPReply.isPositiveCompletion(reply) && !FTPReply.isPositivePreliminary(reply)) {
        throw new CitrusRuntimeException(
            String.format(
                "Failed to send FTP command - reply is: %s:%s", reply, ftpClient.getReplyString()));
      }

      log.info(
          String.format(
              "FTP message was successfully sent to: '%s:%s'",
              getEndpointConfiguration().getHost(), getEndpointConfiguration().getPort()));

      correlationManager.store(
          correlationKey,
          new FtpMessage(ftpMessage.getCommand(), ftpMessage.getArguments())
              .replyCode(reply)
              .replyString(ftpClient.getReplyString()));
    } catch (IOException e) {
      throw new CitrusRuntimeException("Failed to execute ftp command", e);
    }
  }