protected void writeFile()

in wagon-providers/wagon-ssh-common-test/src/main/java/org/apache/maven/wagon/providers/ssh/ScpCommand.java [385:451]


    protected void writeFile( String header, SshFile path )
        throws IOException
    {
        if ( LOG.isDebugEnabled() )
        {
            LOG.debug( "Writing file {}", path );
        }
        if ( !header.startsWith( "C" ) )
        {
            throw new IOException( "Expected a C message but got '" + header + "'" );
        }

        String perms = header.substring( 1, 5 );
        long length = Long.parseLong( header.substring( 6, header.indexOf( ' ', 6 ) ) );
        String name = header.substring( header.indexOf( ' ', 6 ) + 1 );

        SshFile file;
        if ( path.doesExist() && path.isDirectory() )
        {
            file = root.getFile( path, name );
        }
        else if ( path.doesExist() && path.isFile() )
        {
            file = path;
        }
        else if ( !path.doesExist() && path.getParentFile().doesExist() && path.getParentFile().isDirectory() )
        {
            file = path;
        }
        else
        {
            throw new IOException( "Can not write to " + path );
        }
        if ( file.doesExist() && file.isDirectory() )
        {
            throw new IOException( "File is a directory: " + file );
        }
        else if ( file.doesExist() && !file.isWritable() )
        {
            throw new IOException( "Can not write to file: " + file );
        }
        OutputStream os = file.createOutputStream( 0 );
        try
        {
            ack();

            byte[] buffer = new byte[8 * 1024];
            while ( length > 0 )
            {
                int len = (int) Math.min( length, buffer.length );
                len = in.read( buffer, 0, len );
                if ( len <= 0 )
                {
                    throw new IOException( "End of stream reached" );
                }
                os.write( buffer, 0, len );
                length -= len;
            }
        }
        finally
        {
            os.close();
        }

        ack();
        readAck( false );
    }