public UnixSshPath relativize()

in src/main/java/com/pastdev/jsch/nio/file/UnixSshPath.java [233:292]


    public UnixSshPath relativize( Path other ) {
        if ( other == null ) {
            throw new NullPointerException();
        }
        if ( !(other instanceof UnixSshPath) ) {
            throw new ProviderMismatchException();
        }

        UnixSshPath unixOther = (UnixSshPath) other;
        if ( isAbsolute() && !unixOther.isAbsolute() ) {
            throw new IllegalArgumentException( "this and other must have same isAbsolute" );
        }

        if ( getNameCount() == 0 ) {
            return unixOther;
        }

        Path relative = null;
        Path remainingOther = null;
        Iterator<Path> otherIterator = unixOther.iterator();
        for ( Path part : this ) {
            if ( relative != null ) {
                relative = relative.resolve( ".." );
                continue;
            }

            if ( otherIterator.hasNext() ) {
                Path otherPart = otherIterator.next();
                if ( !part.equals( otherPart ) ) {
                    remainingOther = otherPart;
                    while ( otherIterator.hasNext() ) {
                        remainingOther = remainingOther.resolve(
                                otherIterator.next() );
                    }
                    relative = new UnixSshPath( getFileSystem(), ".." );
                }
            }
            else {
                relative = new UnixSshPath( getFileSystem(), ".." );
            }
        }

        if ( relative == null ) {
            while ( otherIterator.hasNext() ) {
                if ( remainingOther == null ) {
                    remainingOther = new UnixSshPath( getFileSystem(), "" );
                }
                else {
                    remainingOther = remainingOther.resolve(
                            otherIterator.next() );
                }
            }
            return remainingOther == null
                    ? new UnixSshPath( getFileSystem(), "" )
                    : (UnixSshPath) remainingOther;
        }
        return remainingOther == null
                ? (UnixSshPath) relative
                : (UnixSshPath) relative.resolve( remainingOther );
    }