You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2018/09/06 16:03:26 UTC

[16/51] [abbrv] mina-sshd git commit: [SSHD-842] Split common utilities code from sshd-core into sshd-common (new artifact)

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/Readable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/Readable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/Readable.java
deleted file mode 100644
index 3075eb3..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/Readable.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util;
-
-import java.nio.ByteBuffer;
-import java.util.Objects;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public interface Readable {
-
-    int available();
-
-    void getRawBytes(byte[] data, int offset, int len);
-
-    /**
-     * Wrap a {@link ByteBuffer} as a {@link Readable} instance
-     *
-     * @param buffer The {@link ByteBuffer} to wrap - never {@code null}
-     * @return The {@link Readable} wrapper
-     */
-    static Readable readable(ByteBuffer buffer) {
-        Objects.requireNonNull(buffer, "No buffer to wrap");
-        return new Readable() {
-            @Override
-            public int available() {
-                return buffer.remaining();
-            }
-
-            @Override
-            public void getRawBytes(byte[] data, int offset, int len) {
-                buffer.get(data, offset, len);
-            }
-        };
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/ReflectionUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/ReflectionUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/ReflectionUtils.java
deleted file mode 100644
index 84a84f9..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/ReflectionUtils.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util;
-
-import java.lang.reflect.Field;
-import java.util.Collection;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public final class ReflectionUtils {
-    public static final Function<Field, String> FIELD_NAME_EXTRACTOR = f -> (f == null) ? null : f.getName();
-
-    private ReflectionUtils() {
-        throw new UnsupportedOperationException("No instance");
-    }
-
-    public static Collection<Field> getMatchingFields(Class<?> clazz, Predicate<? super Field> acceptor) {
-        return GenericUtils.selectMatchingMembers(acceptor, clazz.getFields());
-    }
-
-    public static Collection<Field> getMatchingDeclaredFields(Class<?> clazz, Predicate<? super Field> acceptor) {
-        return GenericUtils.selectMatchingMembers(acceptor, clazz.getDeclaredFields());
-    }
-
-    public static boolean isClassAvailable(ClassLoader cl, String className) {
-        try {
-            cl.loadClass(className);
-            return true;
-        } catch (Throwable ignored) {
-            return false;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
deleted file mode 100644
index 53bca90..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
+++ /dev/null
@@ -1,805 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util;
-
-import java.io.File;
-import java.nio.file.FileSystem;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.StringTokenizer;
-
-/**
- * <p>This is a utility class used by selectors and DirectoryScanner. The
- * functionality more properly belongs just to selectors, but unfortunately
- * DirectoryScanner exposed these as protected methods. Thus we have to
- * support any subclasses of DirectoryScanner that may access these methods.
- * </p>
- * <p>This is a Singleton.</p>
- *
- * @author Arnout J. Kuiper
- *         <a href="mailto:ajkuiper@wxs.nl">ajkuiper@wxs.nl</a>
- * @author Magesh Umasankar
- * @author <a href="mailto:bruce@callenish.com">Bruce Atherton</a>
- * @version $Id$
- * @since 1.5
- */
-public final class SelectorUtils {
-
-    public static final String PATTERN_HANDLER_PREFIX = "[";
-
-    public static final String PATTERN_HANDLER_SUFFIX = "]";
-
-    public static final String REGEX_HANDLER_PREFIX = "%regex" + PATTERN_HANDLER_PREFIX;
-
-    public static final String ANT_HANDLER_PREFIX = "%ant" + PATTERN_HANDLER_PREFIX;
-
-    /**
-     * Private Constructor
-     */
-    private SelectorUtils() {
-        throw new UnsupportedOperationException("No instance allowed");
-    }
-
-    /**
-     * <p>Tests whether or not a given path matches the start of a given
-     * pattern up to the first "**".</p>
-     *
-     * <p>This is not a general purpose test and should only be used if you
-     * can live with false positives. For example, <code>pattern=**\a</code>
-     * and <code>str=b</code> will yield <code>true</code>.</p>
-     *
-     * @param pattern The pattern to match against. Must not be
-     *                {@code null}.
-     * @param str     The path to match, as a String. Must not be
-     *                {@code null}.
-     * @return whether or not a given path matches the start of a given
-     * pattern up to the first "**".
-     */
-    public static boolean matchPatternStart(String pattern, String str) {
-        return matchPatternStart(pattern, str, true);
-    }
-
-    /**
-     * <p>Tests whether or not a given path matches the start of a given
-     * pattern up to the first "**".</p>
-     *
-     * <p>This is not a general purpose test and should only be used if you
-     * can live with false positives. For example, <code>pattern=**\a</code>
-     * and <code>str=b</code> will yield <code>true</code>.</p>
-     *
-     * @param pattern         The pattern to match against. Must not be
-     *                        {@code null}.
-     * @param str             The path to match, as a String. Must not be
-     *                        {@code null}.
-     * @param isCaseSensitive Whether or not matching should be performed
-     *                        case sensitively.
-     * @return whether or not a given path matches the start of a given
-     * pattern up to the first "**".
-     */
-    public static boolean matchPatternStart(String pattern, String str,
-                                            boolean isCaseSensitive) {
-        if (pattern.length() > (REGEX_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length() + 1)
-                && pattern.startsWith(REGEX_HANDLER_PREFIX) && pattern.endsWith(PATTERN_HANDLER_SUFFIX)) {
-            // FIXME: ICK! But we can't do partial matches for regex, so we have to reserve judgement until we have
-            // a file to deal with, or we can definitely say this is an exclusion...
-            return true;
-        } else {
-            if (pattern.length() > (ANT_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length() + 1)
-                    && pattern.startsWith(ANT_HANDLER_PREFIX) && pattern.endsWith(PATTERN_HANDLER_SUFFIX)) {
-                pattern =
-                        pattern.substring(ANT_HANDLER_PREFIX.length(), pattern.length() - PATTERN_HANDLER_SUFFIX.length());
-            }
-
-            String altStr = str.replace('\\', '/');
-
-            return matchAntPathPatternStart(pattern, str, File.separator, isCaseSensitive)
-                    || matchAntPathPatternStart(pattern, altStr, "/", isCaseSensitive);
-        }
-    }
-
-    private static boolean matchAntPathPatternStart(String pattern, String str, String separator, boolean isCaseSensitive) {
-        // When str starts with a File.separator, pattern has to start with a
-        // File.separator.
-        // When pattern starts with a File.separator, str has to start with a
-        // File.separator.
-        if (str.startsWith(separator) != pattern.startsWith(separator)) {
-            return false;
-        }
-
-        List<String> patDirs = tokenizePath(pattern, separator);
-        List<String> strDirs = tokenizePath(str, separator);
-
-        int patIdxStart = 0;
-        int patIdxEnd = patDirs.size() - 1;
-        int strIdxStart = 0;
-        int strIdxEnd = strDirs.size() - 1;
-
-        // up to first '**'
-        while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
-            String patDir = patDirs.get(patIdxStart);
-            if (patDir.equals("**")) {
-                break;
-            }
-            if (!match(patDir, strDirs.get(strIdxStart),
-                    isCaseSensitive)) {
-                return false;
-            }
-            patIdxStart++;
-            strIdxStart++;
-        }
-
-        // CHECKSTYLE:OFF
-        if (strIdxStart > strIdxEnd) {
-            // String is exhausted
-            return true;
-        } else {
-            return patIdxStart <= patIdxEnd;
-        }
-        // CHECKSTYLE:ON
-    }
-
-    /**
-     * Tests whether or not a given path matches a given pattern.
-     *
-     * @param pattern The pattern to match against. Must not be
-     *                {@code null}.
-     * @param str     The path to match, as a String. Must not be
-     *                {@code null}.
-     * @return <code>true</code> if the pattern matches against the string,
-     * or <code>false</code> otherwise.
-     */
-    public static boolean matchPath(String pattern, String str) {
-        return matchPath(pattern, str, true);
-    }
-
-    /**
-     * Tests whether or not a given path matches a given pattern.
-     *
-     * @param pattern         The pattern to match against. Must not be
-     *                        {@code null}.
-     * @param str             The path to match, as a String. Must not be
-     *                        {@code null}.
-     * @param isCaseSensitive Whether or not matching should be performed
-     *                        case sensitively.
-     * @return <code>true</code> if the pattern matches against the string,
-     * or <code>false</code> otherwise.
-     */
-    public static boolean matchPath(String pattern, String str, boolean isCaseSensitive) {
-        if (pattern.length() > (REGEX_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length() + 1)
-                && pattern.startsWith(REGEX_HANDLER_PREFIX) && pattern.endsWith(PATTERN_HANDLER_SUFFIX)) {
-            pattern = pattern.substring(REGEX_HANDLER_PREFIX.length(), pattern.length()
-                    - PATTERN_HANDLER_SUFFIX.length());
-
-            return str.matches(pattern);
-        } else {
-            if (pattern.length() > (ANT_HANDLER_PREFIX.length() + PATTERN_HANDLER_SUFFIX.length() + 1)
-                    && pattern.startsWith(ANT_HANDLER_PREFIX) && pattern.endsWith(PATTERN_HANDLER_SUFFIX)) {
-                pattern =
-                        pattern.substring(ANT_HANDLER_PREFIX.length(), pattern.length() - PATTERN_HANDLER_SUFFIX.length());
-            }
-
-            return matchAntPathPattern(pattern, str, isCaseSensitive);
-        }
-    }
-
-    private static boolean matchAntPathPattern(String pattern, String str, boolean isCaseSensitive) {
-        // When str starts with a File.separator, pattern has to start with a
-        // File.separator.
-        // When pattern starts with a File.separator, str has to start with a
-        // File.separator.
-        if (str.startsWith(File.separator) != pattern.startsWith(File.separator)) {
-            return false;
-        }
-
-        List<String> patDirs = tokenizePath(pattern, File.separator);
-        List<String> strDirs = tokenizePath(str, File.separator);
-
-        int patIdxStart = 0;
-        int patIdxEnd = patDirs.size() - 1;
-        int strIdxStart = 0;
-        int strIdxEnd = strDirs.size() - 1;
-
-        // up to first '**'
-        while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
-            String patDir = patDirs.get(patIdxStart);
-            if (patDir.equals("**")) {
-                break;
-            }
-            if (!match(patDir, strDirs.get(strIdxStart),
-                    isCaseSensitive)) {
-                patDirs = null;
-                strDirs = null;
-                return false;
-            }
-            patIdxStart++;
-            strIdxStart++;
-        }
-        if (strIdxStart > strIdxEnd) {
-            // String is exhausted
-            for (int i = patIdxStart; i <= patIdxEnd; i++) {
-                if (!patDirs.get(i).equals("**")) {
-                    patDirs = null;
-                    strDirs = null;
-                    return false;
-                }
-            }
-            return true;
-        } else {
-            if (patIdxStart > patIdxEnd) {
-                // String not exhausted, but pattern is. Failure.
-                patDirs = null;
-                strDirs = null;
-                return false;
-            }
-        }
-
-        // up to last '**'
-        while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
-            String patDir = patDirs.get(patIdxEnd);
-            if (patDir.equals("**")) {
-                break;
-            }
-            if (!match(patDir, strDirs.get(strIdxEnd),
-                    isCaseSensitive)) {
-                patDirs = null;
-                strDirs = null;
-                return false;
-            }
-            patIdxEnd--;
-            strIdxEnd--;
-        }
-        if (strIdxStart > strIdxEnd) {
-            // String is exhausted
-            for (int i = patIdxStart; i <= patIdxEnd; i++) {
-                if (!patDirs.get(i).equals("**")) {
-                    patDirs = null;
-                    strDirs = null;
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) {
-            int patIdxTmp = -1;
-            for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {
-                if (patDirs.get(i).equals("**")) {
-                    patIdxTmp = i;
-                    break;
-                }
-            }
-            if (patIdxTmp == patIdxStart + 1) {
-                // '**/**' situation, so skip one
-                patIdxStart++;
-                continue;
-            }
-            // Find the pattern between padIdxStart & padIdxTmp in str between
-            // strIdxStart & strIdxEnd
-            int patLength = patIdxTmp - patIdxStart - 1;
-            int strLength = strIdxEnd - strIdxStart + 1;
-            int foundIdx = -1;
-            strLoop:
-            for (int i = 0; i <= strLength - patLength; i++) {
-                for (int j = 0; j < patLength; j++) {
-                    String subPat = patDirs.get(patIdxStart + j + 1);
-                    String subStr = strDirs.get(strIdxStart + i + j);
-                    if (!match(subPat, subStr, isCaseSensitive)) {
-                        continue strLoop;
-                    }
-                }
-
-                foundIdx = strIdxStart + i;
-                break;
-            }
-
-            if (foundIdx == -1) {
-                patDirs = null;
-                strDirs = null;
-                return false;
-            }
-
-            patIdxStart = patIdxTmp;
-            strIdxStart = foundIdx + patLength;
-        }
-
-        for (int i = patIdxStart; i <= patIdxEnd; i++) {
-            if (!patDirs.get(i).equals("**")) {
-                patDirs = null;
-                strDirs = null;
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Tests whether or not a string matches against a pattern.
-     * The pattern may contain two special characters:<br>
-     * '*' means zero or more characters<br>
-     * '?' means one and only one character
-     *
-     * @param pattern The pattern to match against.
-     *                Must not be {@code null}.
-     * @param str     The string which must be matched against the pattern.
-     *                Must not be {@code null}.
-     * @return <code>true</code> if the string matches against the pattern,
-     * or <code>false</code> otherwise.
-     */
-    public static boolean match(String pattern, String str) {
-        return match(pattern, str, true);
-    }
-
-    /**
-     * Tests whether or not a string matches against a pattern.
-     * The pattern may contain two special characters:<br>
-     * '*' means zero or more characters<br>
-     * '?' means one and only one character
-     *
-     * @param pattern         The pattern to match against.
-     *                        Must not be {@code null}.
-     * @param str             The string which must be matched against the pattern.
-     *                        Must not be {@code null}.
-     * @param isCaseSensitive Whether or not matching should be performed
-     *                        case sensitively.
-     * @return <code>true</code> if the string matches against the pattern,
-     * or <code>false</code> otherwise.
-     */
-    @SuppressWarnings("PMD.AssignmentInOperand")
-    public static boolean match(String pattern, String str, boolean isCaseSensitive) {
-        char[] patArr = pattern.toCharArray();
-        char[] strArr = str.toCharArray();
-        int patIdxStart = 0;
-        int patIdxEnd = patArr.length - 1;
-        int strIdxStart = 0;
-        int strIdxEnd = strArr.length - 1;
-        char ch;
-
-        boolean containsStar = false;
-        for (char aPatArr : patArr) {
-            if (aPatArr == '*') {
-                containsStar = true;
-                break;
-            }
-        }
-
-        if (!containsStar) {
-            // No '*'s, so we make a shortcut
-            if (patIdxEnd != strIdxEnd) {
-                return false; // Pattern and string do not have the same size
-            }
-            for (int i = 0; i <= patIdxEnd; i++) {
-                ch = patArr[i];
-                if ((ch != '?') && (!equals(ch, strArr[i], isCaseSensitive))) {
-                    return false; // Character mismatch
-                }
-            }
-            return true; // String matches against pattern
-        }
-
-        if (patIdxEnd == 0) {
-            return true; // Pattern contains only '*', which matches anything
-        }
-
-        // Process characters before first star
-        // CHECKSTYLE:OFF
-        while (((ch = patArr[patIdxStart]) != '*') && (strIdxStart <= strIdxEnd)) {
-            if ((ch != '?') && (!equals(ch, strArr[strIdxStart], isCaseSensitive))) {
-                return false; // Character mismatch
-            }
-            patIdxStart++;
-            strIdxStart++;
-        }
-        // CHECKSTYLE:ON
-
-        if (strIdxStart > strIdxEnd) {
-            // All characters in the string are used. Check if only '*'s are
-            // left in the pattern. If so, we succeeded. Otherwise failure.
-            for (int i = patIdxStart; i <= patIdxEnd; i++) {
-                if (patArr[i] != '*') {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        // Process characters after last star
-        // CHECKSTYLE:OFF
-        while (((ch = patArr[patIdxEnd]) != '*') && (strIdxStart <= strIdxEnd)) {
-            if ((ch != '?') && (!equals(ch, strArr[strIdxEnd], isCaseSensitive))) {
-                return false; // Character mismatch
-            }
-            patIdxEnd--;
-            strIdxEnd--;
-        }
-        // CHECKSTYLE:ON
-
-        if (strIdxStart > strIdxEnd) {
-            // All characters in the string are used. Check if only '*'s are
-            // left in the pattern. If so, we succeeded. Otherwise failure.
-            for (int i = patIdxStart; i <= patIdxEnd; i++) {
-                if (patArr[i] != '*') {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        // process pattern between stars. padIdxStart and patIdxEnd point always to a '*'.
-        while ((patIdxStart != patIdxEnd) && (strIdxStart <= strIdxEnd)) {
-            int patIdxTmp = -1;
-            for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {
-                if (patArr[i] == '*') {
-                    patIdxTmp = i;
-                    break;
-                }
-            }
-            if (patIdxTmp == patIdxStart + 1) {
-                // Two stars next to each other, skip the first one.
-                patIdxStart++;
-                continue;
-            }
-            // Find the pattern between padIdxStart & padIdxTmp in str between
-            // strIdxStart & strIdxEnd
-            int patLength = patIdxTmp - patIdxStart - 1;
-            int strLength = strIdxEnd - strIdxStart + 1;
-            int foundIdx = -1;
-            strLoop:
-            for (int i = 0; i <= strLength - patLength; i++) {
-                for (int j = 0; j < patLength; j++) {
-                    ch = patArr[patIdxStart + j + 1];
-                    if (ch != '?' && !equals(ch, strArr[strIdxStart + i + j], isCaseSensitive)) {
-                        continue strLoop;
-                    }
-                }
-
-                foundIdx = strIdxStart + i;
-                break;
-            }
-
-            if (foundIdx == -1) {
-                return false;
-            }
-
-            patIdxStart = patIdxTmp;
-            strIdxStart = foundIdx + patLength;
-        }
-
-        // All characters in the string are used. Check if only '*'s are left
-        // in the pattern. If so, we succeeded. Otherwise failure.
-        for (int i = patIdxStart; i <= patIdxEnd; i++) {
-            if (patArr[i] != '*') {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Tests whether two characters are equal.
-     * @param c1 1st character
-     * @param c2 2nd character
-     * @param isCaseSensitive Whether to compare case sensitive
-     * @return {@code true} if equal characters
-     */
-    public static boolean equals(char c1, char c2, boolean isCaseSensitive) {
-        if (c1 == c2) {
-            return true;
-        }
-        if (!isCaseSensitive) {
-            // NOTE: Try both upper case and lower case as done by String.equalsIgnoreCase()
-            if (Character.toUpperCase(c1) == Character.toUpperCase(c2)
-                    || Character.toLowerCase(c1) == Character.toLowerCase(c2)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Breaks a path up into a Vector of path elements, tokenizing on
-     * <code>File.separator</code>.
-     *
-     * @param path Path to tokenize. Must not be {@code null}.
-     * @return a List of path elements from the tokenized path
-     */
-    public static List<String> tokenizePath(String path) {
-        return tokenizePath(path, File.separator);
-    }
-
-    public static List<String> tokenizePath(String path, String separator) {
-        List<String> ret = new ArrayList<>();
-        StringTokenizer st = new StringTokenizer(path, separator);
-        while (st.hasMoreTokens()) {
-            ret.add(st.nextToken());
-        }
-        return ret;
-    }
-
-    /**   /**
-     * Converts a path to one matching the target file system by applying the
-     * &quot;slashification&quot; rules, converting it to a local path and
-     * then translating its separator to the target file system one (if different
-     * than local one)
-     * @param path          The input path
-     * @param pathSeparator The separator used to build the input path
-     * @param fs            The target {@link FileSystem} - may not be {@code null}
-     * @return The transformed path
-     * @see #translateToLocalFileSystemPath(String, char, String)
-     */
-    public static String translateToLocalFileSystemPath(String path, char pathSeparator, FileSystem fs) {
-        return translateToLocalFileSystemPath(path, pathSeparator,  Objects.requireNonNull(fs, "No target file system").getSeparator());
-    }
-
-    /**
-     * Converts a path to one matching the target file system by applying the
-     * &quot;slashification&quot; rules, converting it to a local path and
-     * then translating its separator to the target file system one (if different
-     * than local one)
-     * @param path          The input path
-     * @param pathSeparator The separator used to build the input path
-     * @param fsSeparator   The target file system separator
-     * @return The transformed path
-     * @see #applySlashifyRules(String, char)
-     * @see #translateToLocalPath(String)
-     * @see #translateToFileSystemPath(String, String, String)
-     */
-    public static String translateToLocalFileSystemPath(String path, char pathSeparator, String fsSeparator) {
-        // In case double slashes and other patterns are used
-        String slashified = applySlashifyRules(path, pathSeparator);
-        // In case we are running on Windows
-        String localPath = translateToLocalPath(slashified);
-        return translateToFileSystemPath(localPath, File.separator, fsSeparator);
-    }
-
-    /**
-     * Applies the &quot;slashification&quot; rules as specified in
-     * <A HREF="http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_266">Single Unix Specification version 3, section 3.266</A>
-     * and <A HREF="http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_11">section 4.11 - Pathname resolution</A>
-     * @param path The original path - ignored if {@code null}/empty or does
-     * not contain any slashes
-     * @param sepChar The &quot;slash&quot; character
-     * @return The effective path - may be same as input if no changes required
-     */
-    public static String applySlashifyRules(String path, char sepChar) {
-        if (GenericUtils.isEmpty(path)) {
-            return path;
-        }
-
-        int curPos = path.indexOf(sepChar);
-        if (curPos < 0) {
-            return path;    // no slashes to handle
-        }
-
-        int lastPos = 0;
-        StringBuilder sb = null;
-        while (curPos < path.length()) {
-            curPos++;   // skip the 1st '/'
-
-            /*
-             * As per Single Unix Specification version 3, section 3.266:
-             *
-             *      Multiple successive slashes are considered to be the
-             *      same as one slash
-             */
-            int nextPos = curPos;
-            while ((nextPos < path.length()) && (path.charAt(nextPos) == sepChar)) {
-                nextPos++;
-            }
-
-            /*
-             * At this stage, nextPos is the first non-slash character after a
-             * possibly 'seqLen' sequence of consecutive slashes.
-             */
-            int seqLen = nextPos - curPos;
-            if (seqLen > 0) {
-                if (sb == null) {
-                    sb = new StringBuilder(path.length() - seqLen);
-                }
-
-                if (lastPos < curPos) {
-                    String clrText = path.substring(lastPos, curPos);
-                    sb.append(clrText);
-                }
-
-                lastPos = nextPos;
-            }
-
-            if (nextPos >= path.length()) {
-                break;  // no more data
-            }
-
-            curPos = path.indexOf(sepChar, nextPos);
-            if (curPos < nextPos) {
-                break;  // no more slashes
-            }
-        }
-
-        // check if any leftovers for the modified path
-        if (sb != null) {
-            if (lastPos < path.length()) {
-                String clrText = path.substring(lastPos);
-                sb.append(clrText);
-            }
-
-            path = sb.toString();
-        }
-
-        /*
-         * At this point we know for sure that 'path' contains only SINGLE
-         * slashes. According to section 4.11 - Pathname resolution
-         *
-         *      A pathname that contains at least one non-slash character
-         *      and that ends with one or more trailing slashes shall be
-         *      resolved as if a single dot character ( '.' ) were appended
-         *      to the pathname.
-         */
-        if ((path.length() > 1) && (path.charAt(path.length() - 1) == sepChar)) {
-            return path + ".";
-        } else {
-            return path;
-        }
-    }
-
-    /**
-     * Converts a possibly '/' separated path to a local path. <B>Note:</B>
-     * takes special care of Windows drive paths - e.g., {@code C:}
-     * by converting them to &quot;C:\&quot;
-     *
-     * @param path The original path - ignored if {@code null}/empty
-     * @return The local path
-     */
-    public static String translateToLocalPath(String path) {
-        if (GenericUtils.isEmpty(path) || (File.separatorChar == '/')) {
-            return path;
-        }
-
-        // This code is reached if we are running on Windows
-        String localPath = path.replace('/', File.separatorChar);
-        // check if '/c:' prefix
-        if ((localPath.charAt(0) == File.separatorChar) && isWindowsDriveSpecified(localPath, 1, localPath.length() - 1)) {
-            localPath = localPath.substring(1);
-        }
-        if (!isWindowsDriveSpecified(localPath)) {
-            return localPath;   // assume a relative path
-        }
-
-        /*
-         * Here we know that we have at least a "C:" string - make sure it
-         * is followed by the local file separator. Note: if all we have is
-         * just the drive, we will create a "C:\" path since this is the
-         * preferred Windows way to refer to root drives in the file system
-         */
-        if (localPath.length() == 2) {
-            return localPath + File.separator;  // all we have is "C:"
-        } else if (localPath.charAt(2) != File.separatorChar) {
-            // be nice and add the missing file separator - C:foo => C:\foo
-            return localPath.substring(0, 2) + File.separator + localPath.substring(2);
-        } else {
-            return localPath;
-        }
-    }
-
-    public static boolean isWindowsDriveSpecified(CharSequence cs) {
-        return isWindowsDriveSpecified(cs, 0, GenericUtils.length(cs));
-    }
-
-    public static boolean isWindowsDriveSpecified(CharSequence cs, int offset, int len) {
-        if ((len < 2) || (cs.charAt(offset + 1) != ':')) {
-            return false;
-        }
-
-        char drive = cs.charAt(offset);
-        return ((drive >= 'a') && (drive <= 'z')) || ((drive >= 'A') && (drive <= 'Z'));
-    }
-
-    /**
-     * Converts a path containing a specific separator to one using the
-     * specified file-system one
-     * @param path          The input path - ignored if {@code null}/empty
-     * @param pathSeparator The separator used to build the input path - may not
-     *                      be {@code null}/empty
-     * @param fs            The target {@link FileSystem} - may not be {@code null}
-     * @return The path where the separator used to build it is replaced by
-     * the file-system one (if different)
-     * @see FileSystem#getSeparator()
-     * @see #translateToFileSystemPath(String, String, String)
-     */
-    public static String translateToFileSystemPath(String path, String pathSeparator, FileSystem fs) {
-        return translateToFileSystemPath(path, pathSeparator, Objects.requireNonNull(fs, "No target file system").getSeparator());
-    }
-
-    /**
-     * Converts a path containing a specific separator to one using the
-     * specified file-system one
-     * @param path          The input path - ignored if {@code null}/empty
-     * @param pathSeparator The separator used to build the input path - may not
-     *                      be {@code null}/empty
-     * @param fsSeparator   The target file system separator - may not be {@code null}/empty
-     * @return The path where the separator used to build it is replaced by
-     * the file-system one (if different)
-     * @throws IllegalArgumentException if path or file-system separator are {@code null}/empty
-     * or if the separators are different and the path contains the target
-     * file-system separator as it would create an ambiguity
-     */
-    public static String translateToFileSystemPath(String path, String pathSeparator, String fsSeparator) {
-        ValidateUtils.checkNotNullAndNotEmpty(pathSeparator, "Missing path separator");
-        ValidateUtils.checkNotNullAndNotEmpty(fsSeparator, "Missing file-system separator");
-
-        if (GenericUtils.isEmpty(path) || Objects.equals(pathSeparator, fsSeparator)) {
-            return path;
-        }
-
-        // make sure path does not contain the target separator
-        if (path.contains(fsSeparator)) {
-            ValidateUtils.throwIllegalArgumentException("File system replacement may yield ambiguous result for %s with separator=%s", path, fsSeparator);
-        }
-
-        // check most likely case
-        if ((pathSeparator.length() == 1) && (fsSeparator.length() == 1)) {
-            return path.replace(pathSeparator.charAt(0), fsSeparator.charAt(0));
-        } else {
-            return path.replace(pathSeparator, fsSeparator);
-        }
-    }
-
-    /**
-     * Returns dependency information on these two files. If src has been
-     * modified later than target, it returns true. If target doesn't exist,
-     * it likewise returns true. Otherwise, target is newer than src and
-     * is not out of date, thus the method returns false. It also returns
-     * false if the src file doesn't even exist, since how could the
-     * target then be out of date.
-     *
-     * @param src         the original file
-     * @param target      the file being compared against
-     * @param granularity the amount in seconds of slack we will give in
-     *                    determining out of dateness
-     * @return whether the target is out of date
-     */
-    public static boolean isOutOfDate(File src, File target, int granularity) {
-        if (!src.exists()) {
-            return false;
-        }
-        if (!target.exists()) {
-            return true;
-        }
-        return (src.lastModified() - granularity) > target.lastModified();
-    }
-
-    /**
-     * "Flattens" a string by removing all whitespace (space, tab, linefeed,
-     * carriage return, and formfeed). This uses StringTokenizer and the
-     * default set of tokens as documented in the single arguement constructor.
-     *
-     * @param input a String to remove all whitespace.
-     * @return a String that has had all whitespace removed.
-     */
-    public static String removeWhitespace(String input) {
-        StringBuilder result = new StringBuilder();
-        if (input != null) {
-            StringTokenizer st = new StringTokenizer(input);
-            while (st.hasMoreTokens()) {
-                result.append(st.nextToken());
-            }
-        }
-        return result.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/SshdEventListener.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/SshdEventListener.java b/sshd-core/src/main/java/org/apache/sshd/common/util/SshdEventListener.java
deleted file mode 100644
index ea6a3dd..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/SshdEventListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util;
-
-import java.lang.reflect.Proxy;
-import java.util.EventListener;
-import java.util.Objects;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public interface SshdEventListener extends EventListener {
-
-    /**
-     * Makes sure that the listener is neither {@code null} nor a proxy
-     *
-     * @param <L> Type of {@link SshdEventListener} being validation
-     * @param listener The listener instance
-     * @param prefix Prefix text to be prepended to validation failure messages
-     * @return The validated instance
-     */
-    static <L extends SshdEventListener> L validateListener(L listener, String prefix) {
-        Objects.requireNonNull(listener, prefix + ": no instance");
-        ValidateUtils.checkTrue(!Proxy.isProxyClass(listener.getClass()), prefix + ": proxies N/A");
-        return listener;
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/ValidateUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/ValidateUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/ValidateUtils.java
deleted file mode 100644
index a55e5d6..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/ValidateUtils.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.function.Function;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public final class ValidateUtils {
-    private ValidateUtils() {
-        throw new UnsupportedOperationException("No instance");
-    }
-
-    public static <T> T checkNotNull(T t, String message) {
-        checkTrue(t != null, message);
-        return t;
-    }
-
-    public static <T> T checkNotNull(T t, String message, Object arg) {
-        checkTrue(t != null, message, arg);
-        return t;
-    }
-
-    public static <T> T checkNotNull(T t, String message, long value) {
-        checkTrue(t != null, message, value);
-        return t;
-    }
-
-    public static <T> T checkNotNull(T t, String message, Object... args) {
-        checkTrue(t != null, message, args);
-        return t;
-    }
-
-    public static String checkNotNullAndNotEmpty(String t, String message) {
-        t = checkNotNull(t, message).trim();
-        checkTrue(GenericUtils.length(t) > 0, message);
-        return t;
-    }
-
-    public static String checkNotNullAndNotEmpty(String t, String message, Object arg) {
-        t = checkNotNull(t, message, arg).trim();
-        checkTrue(GenericUtils.length(t) > 0, message, arg);
-        return t;
-    }
-
-    public static String checkNotNullAndNotEmpty(String t, String message, Object... args) {
-        t = checkNotNull(t, message, args).trim();
-        checkTrue(GenericUtils.length(t) > 0, message, args);
-        return t;
-    }
-
-    public static <K, V, M extends Map<K, V>> M checkNotNullAndNotEmpty(M t, String message, Object... args) {
-        t = checkNotNull(t, message, args);
-        checkTrue(GenericUtils.size(t) > 0, message, args);
-        return t;
-    }
-
-    public static <T, C extends Collection<T>> C checkNotNullAndNotEmpty(C t, String message, Object... args) {
-        t = checkNotNull(t, message, args);
-        checkTrue(GenericUtils.size(t) > 0, message, args);
-        return t;
-    }
-
-    public static <T, C extends Iterable<T>> C checkNotNullAndNotEmpty(C t, String message, Object... args) {
-        t = checkNotNull(t, message, args);
-        checkTrue(GenericUtils.isNotEmpty(t), message, args);
-        return t;
-    }
-
-    public static byte[] checkNotNullAndNotEmpty(byte[] a, String message) {
-        a = checkNotNull(a, message);
-        checkTrue(NumberUtils.length(a) > 0, message);
-        return a;
-    }
-
-    public static byte[] checkNotNullAndNotEmpty(byte[] a, String message, Object... args) {
-        a = checkNotNull(a, message, args);
-        checkTrue(NumberUtils.length(a) > 0, message, args);
-        return a;
-    }
-
-    public static char[] checkNotNullAndNotEmpty(char[] a, String message) {
-        a = checkNotNull(a, message);
-        checkTrue(GenericUtils.length(a) > 0, message);
-        return a;
-    }
-
-    public static char[] checkNotNullAndNotEmpty(char[] a, String message, Object... args) {
-        a = checkNotNull(a, message, args);
-        checkTrue(GenericUtils.length(a) > 0, message, args);
-        return a;
-    }
-
-    public static int[] checkNotNullAndNotEmpty(int[] a, String message) {
-        a = checkNotNull(a, message);
-        checkTrue(NumberUtils.length(a) > 0, message);
-        return a;
-    }
-
-    public static int[] checkNotNullAndNotEmpty(int[] a, String message, Object... args) {
-        a = checkNotNull(a, message, args);
-        checkTrue(NumberUtils.length(a) > 0, message, args);
-        return a;
-    }
-
-    public static <T> T[] checkNotNullAndNotEmpty(T[] t, String message, Object... args) {
-        t = checkNotNull(t, message, args);
-        checkTrue(GenericUtils.length(t) > 0, message, args);
-        return t;
-    }
-
-    public static <T> T checkInstanceOf(Object v, Class<T> expected, String message, long value) {
-        Class<?> actual = checkNotNull(v, message, value).getClass();
-        checkTrue(expected.isAssignableFrom(actual), message, value);
-        return expected.cast(v);
-    }
-
-    public static <T> T checkInstanceOf(Object v, Class<T> expected, String message) {
-        return checkInstanceOf(v, expected, message, GenericUtils.EMPTY_OBJECT_ARRAY);
-    }
-
-    public static <T> T checkInstanceOf(Object v, Class<T> expected, String message, Object arg) {
-        Class<?> actual = checkNotNull(v, message, arg).getClass();
-        checkTrue(expected.isAssignableFrom(actual), message, arg);
-        return expected.cast(v);
-    }
-
-    public static <T> T checkInstanceOf(Object v, Class<T> expected, String message, Object... args) {
-        Class<?> actual = checkNotNull(v, message, args).getClass();
-        checkTrue(expected.isAssignableFrom(actual), message, args);
-        return expected.cast(v);
-    }
-
-    public static void checkTrue(boolean flag, String message) {
-        if (!flag) {
-            throwIllegalArgumentException(message, GenericUtils.EMPTY_OBJECT_ARRAY);
-        }
-    }
-
-    public static void checkTrue(boolean flag, String message, long value) {
-        if (!flag) {
-            throwIllegalArgumentException(message, value);
-        }
-    }
-
-    public static void checkTrue(boolean flag, String message, Object arg) {
-        if (!flag) {
-            throwIllegalArgumentException(message, arg);
-        }
-    }
-
-    public static void checkTrue(boolean flag, String message, Object... args) {
-        if (!flag) {
-            throwIllegalArgumentException(message, args);
-        }
-    }
-
-    public static void throwIllegalArgumentException(String format, Object... args) {
-        throw createFormattedException(IllegalArgumentException::new, format, args);
-    }
-
-    public static void checkState(boolean flag, String message) {
-        if (!flag) {
-            throwIllegalStateException(message, GenericUtils.EMPTY_OBJECT_ARRAY);
-        }
-    }
-
-    public static void checkState(boolean flag, String message, long value) {
-        if (!flag) {
-            throwIllegalStateException(message, value);
-        }
-    }
-
-    public static void checkState(boolean flag, String message, Object arg) {
-        if (!flag) {
-            throwIllegalStateException(message, arg);
-        }
-    }
-
-    public static void checkState(boolean flag, String message, Object... args) {
-        if (!flag) {
-            throwIllegalStateException(message, args);
-        }
-    }
-
-    public static void throwIllegalStateException(String format, Object... args) {
-        throw createFormattedException(IllegalStateException::new, format, args);
-    }
-
-    public static <T extends Throwable> T createFormattedException(
-            Function<? super String, ? extends T> constructor, String format, Object... args) {
-        String message = String.format(format, args);
-        return constructor.apply(message);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/VersionInfo.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/VersionInfo.java b/sshd-core/src/main/java/org/apache/sshd/common/util/VersionInfo.java
deleted file mode 100644
index ed1aab7..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/VersionInfo.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util;
-
-import java.io.Serializable;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class VersionInfo implements Serializable, Comparable<VersionInfo> {
-    private static final long serialVersionUID = -9127482432228413836L;
-
-    private final int majorVersion;
-    private final int minorVersion;
-    private final int release;
-    private final int buildNumber;
-
-    public VersionInfo(int major, int minor) {
-        this(major, minor, 0, 0);
-    }
-
-    public VersionInfo(int major, int minor, int release, int build) {
-        this.majorVersion = major;
-        this.minorVersion = minor;
-        this.release = release;
-        this.buildNumber = build;
-    }
-
-    public final int getMajorVersion() {
-        return majorVersion;
-    }
-
-    public final int getMinorVersion() {
-        return minorVersion;
-    }
-
-    public final int getRelease() {
-        return release;
-    }
-
-    public final int getBuildNumber() {
-        return buildNumber;
-    }
-
-    @Override
-    public int hashCode() {
-        return NumberUtils.hashCode(getMajorVersion(), getMinorVersion(), getRelease(), getBuildNumber());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (this == obj) {
-            return true;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        return compareTo((VersionInfo) obj) == 0;
-    }
-
-    @Override
-    public int compareTo(VersionInfo o) {
-        if (o == null) {
-            return -1;  // push nulls to end
-        }
-        if (o == this) {
-            return 0;
-        }
-
-        int nRes = Integer.compare(getMajorVersion(), o.getMajorVersion());
-        if (nRes == 0) {
-            nRes = Integer.compare(getMinorVersion(), o.getMinorVersion());
-        }
-        if (nRes == 0) {
-            nRes = Integer.compare(getRelease(), o.getRelease());
-        }
-        if (nRes == 0) {
-            nRes = Integer.compare(getBuildNumber(), o.getBuildNumber());
-        }
-
-        return nRes;
-    }
-
-    @Override
-    public String toString() {
-        return NumberUtils.join('.', getMajorVersion(), getMinorVersion(), getRelease(), getBuildNumber());
-    }
-
-    /**
-     * Parses a version string - assumed to contain at most 4 non-negative
-     * components separated by a '.'. If less than 4 components are found, then
-     * the rest are assumed to be zero. If more than 4 components found, then
-     * only the 1st ones are parsed.
-     *
-     * @param version The version string - ignored if {@code null}/empty
-     * @return The parsed {@link VersionInfo} - or {@code null} if empty input
-     * @throws NumberFormatException If failed to parse any of the components
-     * @throws IllegalArgumentException If any of the parsed components is negative
-     */
-    public static VersionInfo parse(String version) throws NumberFormatException {
-        String[] comps = GenericUtils.split(version, '.');
-        if (GenericUtils.isEmpty(comps)) {
-            return null;
-        }
-
-        int[] values = new int[4];
-        int maxValues = Math.min(comps.length, values.length);
-        for (int index = 0; index < maxValues; index++) {
-            String c = comps[index];
-            int v = Integer.parseInt(c);
-            ValidateUtils.checkTrue(v >= 0, "Invalid version component in %s", version);
-            values[index] = v;
-        }
-
-        return new VersionInfo(values[0], values[1], values[2], values[3]);
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java
deleted file mode 100644
index dd61473..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java
+++ /dev/null
@@ -1,798 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.buffer;
-
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.security.GeneralSecurityException;
-import java.security.KeyFactory;
-import java.security.KeyPair;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.interfaces.DSAParams;
-import java.security.interfaces.DSAPrivateKey;
-import java.security.interfaces.DSAPublicKey;
-import java.security.interfaces.ECPrivateKey;
-import java.security.interfaces.ECPublicKey;
-import java.security.interfaces.RSAPrivateCrtKey;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.DSAPrivateKeySpec;
-import java.security.spec.DSAPublicKeySpec;
-import java.security.spec.ECParameterSpec;
-import java.security.spec.ECPoint;
-import java.security.spec.ECPrivateKeySpec;
-import java.security.spec.ECPublicKeySpec;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.RSAPrivateCrtKeySpec;
-import java.security.spec.RSAPublicKeySpec;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.IntUnaryOperator;
-import java.util.logging.Level;
-
-import org.apache.sshd.common.PropertyResolver;
-import org.apache.sshd.common.SshException;
-import org.apache.sshd.common.cipher.ECCurves;
-import org.apache.sshd.common.config.keys.KeyUtils;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.common.util.GenericUtils;
-import org.apache.sshd.common.util.NumberUtils;
-import org.apache.sshd.common.util.Readable;
-import org.apache.sshd.common.util.buffer.keys.BufferPublicKeyParser;
-import org.apache.sshd.common.util.logging.SimplifiedLog;
-import org.apache.sshd.common.util.security.SecurityUtils;
-
-/**
- * Provides an abstract message buffer for encoding SSH messages
- *
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public abstract class Buffer implements Readable {
-    protected final byte[] workBuf = new byte[Long.BYTES];
-
-    protected Buffer() {
-        super();
-    }
-
-    public abstract int rpos();
-
-    public abstract void rpos(int rpos);
-
-    public abstract int wpos();
-
-    public abstract void wpos(int wpos);
-
-    public abstract int capacity();
-
-    public abstract byte[] array();
-
-    public abstract void compact();
-
-    public byte[] getCompactData() {
-        int l = available();
-        if (l > 0) {
-            byte[] b = new byte[l];
-            System.arraycopy(array(), rpos(), b, 0, l);
-            return b;
-        } else {
-            return GenericUtils.EMPTY_BYTE_ARRAY;
-        }
-    }
-
-    public void clear() {
-        clear(true);
-    }
-
-    public abstract void clear(boolean wipeData);
-
-    public boolean isValidMessageStructure(Class<?>... fieldTypes) {
-        return isValidMessageStructure(GenericUtils.isEmpty(fieldTypes) ? Collections.emptyList() : Arrays.asList(fieldTypes));
-    }
-
-    public boolean isValidMessageStructure(Collection<Class<?>> fieldTypes) {
-        if (GenericUtils.isEmpty(fieldTypes)) {
-            return true;
-        }
-
-        int remainLen = available();
-        int readOffset = 0;
-        for (Class<?> ft : fieldTypes) {
-            if ((ft == boolean.class) || (ft == Boolean.class)
-                    || (ft == byte.class) || (ft == Byte.class)) {
-                if (remainLen < Byte.BYTES) {
-                    return false;
-                }
-
-                remainLen -= Byte.BYTES;
-                readOffset += Byte.BYTES;
-            } else if ((ft == short.class) || (ft == Short.class)) {
-                if (remainLen < Short.BYTES) {
-                    return false;
-                }
-
-                remainLen -= Short.BYTES;
-                readOffset += Short.BYTES;
-            } else if ((ft == int.class) || (ft == Integer.class)) {
-                if (remainLen < Integer.BYTES) {
-                    return false;
-                }
-
-                remainLen -= Integer.BYTES;
-                readOffset += Integer.BYTES;
-            } else if ((ft == long.class) || (ft == Long.class)) {
-                if (remainLen < Long.BYTES) {
-                    return false;
-                }
-
-                remainLen -= Long.BYTES;
-                readOffset += Long.BYTES;
-            } else if ((ft == byte[].class) || (ft == String.class)) {
-                if (remainLen < Integer.BYTES) {
-                    return false;
-                }
-
-                copyRawBytes(readOffset, workBuf, 0, Integer.BYTES);
-                remainLen -= Integer.BYTES;
-                readOffset += Integer.BYTES;
-
-                long length = BufferUtils.getUInt(workBuf, 0, Integer.BYTES);
-                if (length > remainLen) {
-                    return false;
-                }
-
-                remainLen -= (int) length;
-                readOffset += (int) length;
-            }
-        }
-
-        return true;
-    }
-
-    protected abstract void copyRawBytes(int offset, byte[] buf, int pos, int len);
-
-    public String toHex() {
-        return BufferUtils.toHex(array(), rpos(), available());
-    }
-
-    public void dumpHex(SimplifiedLog logger, String prefix, PropertyResolver resolver) {
-        dumpHex(logger, BufferUtils.DEFAULT_HEXDUMP_LEVEL, prefix, resolver);
-    }
-
-    public void dumpHex(SimplifiedLog logger, Level level, String prefix, PropertyResolver resolver) {
-        BufferUtils.dumpHex(logger, level, prefix, resolver, BufferUtils.DEFAULT_HEX_SEPARATOR, array(), rpos(), available());
-    }
-
-    /*======================
-       Read methods
-     ======================*/
-
-    public int getUByte() {
-        return getByte() & 0xFF;
-    }
-
-    public byte getByte() {
-        ensureAvailable(Byte.BYTES);
-        getRawBytes(workBuf, 0, Byte.BYTES);
-        return workBuf[0];
-    }
-
-    public short getShort() {
-        ensureAvailable(Short.BYTES);
-        getRawBytes(workBuf, 0, Short.BYTES);
-        short v = (short) ((workBuf[1] << Byte.SIZE) & 0xFF00);
-        v |= (short) (workBuf[0] & 0xF);
-        return v;
-    }
-
-    public int getInt() {
-        return (int) getUInt();
-    }
-
-    public long getUInt() {
-        ensureAvailable(Integer.BYTES);
-        getRawBytes(workBuf, 0, Integer.BYTES);
-        return BufferUtils.getUInt(workBuf, 0, Integer.BYTES);
-    }
-
-    public long getLong() {
-        ensureAvailable(Long.BYTES);
-        getRawBytes(workBuf, 0, Long.BYTES);
-        long l = ((long) workBuf[0] << 56) & 0xff00000000000000L;
-        l |= ((long) workBuf[1] << 48) & 0x00ff000000000000L;
-        l |= ((long) workBuf[2] << 40) & 0x0000ff0000000000L;
-        l |= ((long) workBuf[3] << 32) & 0x000000ff00000000L;
-        l |= ((long) workBuf[4] << 24) & 0x00000000ff000000L;
-        l |= ((long) workBuf[5] << 16) & 0x0000000000ff0000L;
-        l |= ((long) workBuf[6] << 8) & 0x000000000000ff00L;
-        l |= (workBuf[7]) & 0x00000000000000ffL;
-        return l;
-    }
-
-    @SuppressWarnings("PMD.BooleanGetMethodName")
-    public boolean getBoolean() {
-        return getByte() != 0;
-    }
-
-    public String getString() {
-        return getString(StandardCharsets.UTF_8);
-    }
-
-    /**
-     * @param usePrependedLength If {@code true} then there is a 32-bit
-     *                           value indicating the number of strings to read. Otherwise, the
-     *                           method will use a &quot;greedy&quot; reading of strings while more
-     *                           data available
-     * @return A {@link Collection} of the read strings
-     * @see #getStringList(boolean, Charset)
-     */
-    public Collection<String> getStringList(boolean usePrependedLength) {
-        return getStringList(usePrependedLength, StandardCharsets.UTF_8);
-    }
-
-    /**
-     * @param usePrependedLength If {@code true} then there is a 32-bit
-     *                           value indicating the number of strings to read. Otherwise, the
-     *                           method will use a &quot;greedy&quot; reading of strings while more
-     *                           data available
-     * @param charset            The {@link Charset} to use for the string
-     * @return A {@link Collection} of the read strings
-     * @see #getStringList(int, Charset)
-     * @see #getAvailableStrings()
-     */
-    public Collection<String> getStringList(boolean usePrependedLength, Charset charset) {
-        if (usePrependedLength) {
-            int count = getInt();
-            return getStringList(count, charset);
-        } else {
-            return getAvailableStrings(charset);
-        }
-    }
-
-    /**
-     * @return The remaining data as a list of strings
-     * @see #getAvailableStrings(Charset)
-     */
-    public Collection<String> getAvailableStrings() {
-        return getAvailableStrings(StandardCharsets.UTF_8);
-    }
-
-    /**
-     * @param charset The {@link Charset} to use for the strings
-     * @return The remaining data as a list of strings
-     * @see #available()
-     * @see #getString(Charset)
-     */
-    public Collection<String> getAvailableStrings(Charset charset) {
-        Collection<String> list = new LinkedList<>();
-        while (available() > 0) {
-            String s = getString(charset);
-            list.add(s);
-        }
-
-        return list;
-    }
-
-    /**
-     * @param count The <U>exact</U> number of strings to read - can be zero
-     * @return A {@link List} with the specified number of strings
-     * @see #getStringList(int, Charset)
-     */
-    public List<String> getStringList(int count) {
-        return getStringList(count, StandardCharsets.UTF_8);
-    }
-
-    /**
-     * @param count   The <U>exact</U> number of strings to read - can be zero
-     * @param charset The {@link Charset} of the strings
-     * @return A {@link List} with the specified number of strings
-     * @see #getString(Charset)
-     */
-    public List<String> getStringList(int count, Charset charset) {
-        if (count == 0) {
-            return Collections.emptyList();
-        }
-
-        List<String> list = new ArrayList<>(count);
-        for (int index = 0; index < count; index++) {
-            String s = getString(charset);
-            list.add(s);
-        }
-
-        return list;
-    }
-
-    public abstract String getString(Charset charset);
-
-    public BigInteger getMPInt() {
-        return new BigInteger(getMPIntAsBytes());
-    }
-
-    public byte[] getMPIntAsBytes() {
-        return getBytes();
-    }
-
-    public byte[] getBytes() {
-        int len = getInt();
-        if (len < 0) {
-            throw new BufferException("Bad item length: " + len);
-        }
-        ensureAvailable(len);
-        byte[] b = new byte[len];
-        getRawBytes(b);
-        return b;
-    }
-
-    public void getRawBytes(byte[] buf) {
-        getRawBytes(buf, 0, buf.length);
-    }
-
-    public PublicKey getPublicKey() throws SshException {
-        return getPublicKey(BufferPublicKeyParser.DEFAULT);
-    }
-
-    /**
-     * @param parser A {@link BufferPublicKeyParser} to extract the key from the buffer
-     * - never {@code null}
-     * @return The extracted {@link PublicKey} - may be {@code null} if the parser so decided
-     * @throws SshException If failed to extract the key
-     * @see #getRawPublicKey(BufferPublicKeyParser)
-     */
-    public PublicKey getPublicKey(BufferPublicKeyParser<? extends PublicKey> parser) throws SshException {
-        int ow = wpos();
-        int len = getInt();
-        wpos(rpos() + len);
-        try {
-            return getRawPublicKey(parser);
-        } finally {
-            wpos(ow);
-        }
-    }
-
-    public PublicKey getRawPublicKey() throws SshException {
-        return getRawPublicKey(BufferPublicKeyParser.DEFAULT);
-    }
-
-    /**
-     * @param parser A {@link BufferPublicKeyParser} to extract the key from the buffer
-     * - never {@code null}
-     * @return The extracted {@link PublicKey} - may be {@code null} if the parser so decided
-     * @throws SshException If failed to extract the key
-     */
-    public PublicKey getRawPublicKey(BufferPublicKeyParser<? extends PublicKey> parser) throws SshException {
-        Objects.requireNonNull(parser, "No key data parser");
-        try {
-            String keyType = getString();
-            if (!parser.isKeyTypeSupported(keyType)) {
-                throw new NoSuchAlgorithmException("Key type=" + keyType + ") not supported by parser=" + parser);
-            }
-
-            return parser.getRawPublicKey(keyType, this);
-        } catch (GeneralSecurityException e) {
-            throw new SshException(e);
-        }
-    }
-
-    public KeyPair getKeyPair() throws SshException {
-        try {
-            final PublicKey pub;
-            final PrivateKey prv;
-            final String keyAlg = getString();
-            if (KeyPairProvider.SSH_RSA.equals(keyAlg)) {
-                BigInteger e = getMPInt();
-                BigInteger n = getMPInt();
-                BigInteger d = getMPInt();
-                BigInteger qInv = getMPInt();
-                BigInteger q = getMPInt();
-                BigInteger p = getMPInt();
-                BigInteger dP = d.remainder(p.subtract(BigInteger.valueOf(1)));
-                BigInteger dQ = d.remainder(q.subtract(BigInteger.valueOf(1)));
-                KeyFactory keyFactory = SecurityUtils.getKeyFactory(KeyUtils.RSA_ALGORITHM);
-                pub = keyFactory.generatePublic(new RSAPublicKeySpec(n, e));
-                prv = keyFactory.generatePrivate(new RSAPrivateCrtKeySpec(n, e, d, p, q, dP, dQ, qInv));
-            } else if (KeyPairProvider.SSH_DSS.equals(keyAlg)) {
-                BigInteger p = getMPInt();
-                BigInteger q = getMPInt();
-                BigInteger g = getMPInt();
-                BigInteger y = getMPInt();
-                BigInteger x = getMPInt();
-                KeyFactory keyFactory = SecurityUtils.getKeyFactory(KeyUtils.DSS_ALGORITHM);
-                pub = keyFactory.generatePublic(new DSAPublicKeySpec(y, p, q, g));
-                prv = keyFactory.generatePrivate(new DSAPrivateKeySpec(x, p, q, g));
-            } else if (KeyPairProvider.SSH_ED25519.equals(keyAlg)) {
-                return SecurityUtils.extractEDDSAKeyPair(this, keyAlg);
-            } else {
-                ECCurves curve = ECCurves.fromKeyType(keyAlg);
-                if (curve == null) {
-                    throw new NoSuchAlgorithmException("Unsupported key pair algorithm: " + keyAlg);
-                }
-                String curveName = curve.getName();
-                ECParameterSpec params = curve.getParameters();
-                return extractEC(curveName, params);
-            }
-
-            return new KeyPair(pub, prv);
-        } catch (GeneralSecurityException e) {
-            throw new SshException(e);
-        }
-    }
-
-    protected KeyPair extractEC(String expectedCurveName, ECParameterSpec spec) throws GeneralSecurityException {
-        String curveName = getString();
-        if (!expectedCurveName.equals(curveName)) {
-            throw new InvalidKeySpecException("extractEC(" + expectedCurveName + ") mismatched curve name: " + curveName);
-        }
-
-        byte[] groupBytes = getBytes();
-        BigInteger exponent = getMPInt();
-
-        if (spec == null) {
-            throw new InvalidKeySpecException("extractEC(" + expectedCurveName + ") missing parameters for curve");
-        }
-
-        ECPoint group;
-        try {
-            group = ECCurves.octetStringToEcPoint(groupBytes);
-        } catch (RuntimeException e) {
-            throw new InvalidKeySpecException("extractEC(" + expectedCurveName + ")"
-                    + " failed (" + e.getClass().getSimpleName() + ")"
-                    + " to decode EC group for curve: " + e.getMessage(),
-                    e);
-        }
-
-        KeyFactory keyFactory = SecurityUtils.getKeyFactory(KeyUtils.EC_ALGORITHM);
-        PublicKey pubKey = keyFactory.generatePublic(new ECPublicKeySpec(group, spec));
-        PrivateKey privKey = keyFactory.generatePrivate(new ECPrivateKeySpec(exponent, spec));
-        return new KeyPair(pubKey, privKey);
-    }
-
-    public void ensureAvailable(int reqLen) throws BufferException {
-        int availLen = available();
-        if (availLen < reqLen) {
-            throw new BufferException("Underflow: requested=" + reqLen + ", available=" + availLen);
-        }
-    }
-
-    /*======================
-       Write methods
-     ======================*/
-
-    public void putByte(byte b) {
-        ensureCapacity(Byte.BYTES);
-        workBuf[0] = b;
-        putRawBytes(workBuf, 0, Byte.BYTES);
-    }
-
-    public void putBuffer(Readable buffer) {
-        putBuffer(buffer, true);
-    }
-
-    public abstract int putBuffer(Readable buffer, boolean expand);
-
-    public abstract void putBuffer(ByteBuffer buffer);
-
-    /**
-     * Writes 16 bits
-     *
-     * @param i The 16-bit value
-     */
-    public void putShort(int i) {
-        ensureCapacity(Short.BYTES);
-        workBuf[0] = (byte) (i >> 8);
-        workBuf[1] = (byte) i;
-        putRawBytes(workBuf, 0, Short.BYTES);
-    }
-
-    /**
-     * Writes 32 bits
-     *
-     * @param i The 32-bit value
-     */
-    public void putInt(long i) {
-        BufferUtils.validateInt32Value(i, "Invalid 32-bit value: %d");
-        ensureCapacity(Integer.BYTES);
-        BufferUtils.putUInt(i, workBuf, 0, Integer.BYTES);
-        putRawBytes(workBuf, 0, Integer.BYTES);
-    }
-
-    /**
-     * Writes 64 bits
-     *
-     * @param i The 64-bit value
-     */
-    public void putLong(long i) {
-        ensureCapacity(Long.BYTES);
-        workBuf[0] = (byte) (i >> 56);
-        workBuf[1] = (byte) (i >> 48);
-        workBuf[2] = (byte) (i >> 40);
-        workBuf[3] = (byte) (i >> 32);
-        workBuf[4] = (byte) (i >> 24);
-        workBuf[5] = (byte) (i >> 16);
-        workBuf[6] = (byte) (i >> 8);
-        workBuf[7] = (byte) i;
-        putRawBytes(workBuf, 0, Long.BYTES);
-    }
-
-    public void putBoolean(boolean b) {
-        putByte(b ? (byte) 1 : (byte) 0);
-    }
-
-    /**
-     * Adds the bytes to the buffer and wipes the data from the
-     * input buffer <U>after</U> having added it - useful for sensitive
-     * information such as password
-     *
-     * @param b The buffer to add - OK if {@code null}
-     */
-    public void putAndWipeBytes(byte[] b) {
-        putAndWipeBytes(b, 0, NumberUtils.length(b));
-    }
-
-    public void putAndWipeBytes(byte[] b, int off, int len) {
-        putBytes(b, off, len);
-
-        for (int pos = off, index = 0; index < len; pos++, index++) {
-            b[pos] = (byte) 0;
-        }
-    }
-
-    public void putBytes(byte[] b) {
-        putBytes(b, 0, NumberUtils.length(b));
-    }
-
-    public void putBytes(byte[] b, int off, int len) {
-        putInt(len);
-        putRawBytes(b, off, len);
-    }
-
-    /**
-     * Encodes the {@link Objects#toString(Object, String) toString} value of each member.
-     *
-     * @param objects       The objects to be encoded in the buffer - OK if
-     *                      {@code null}/empty
-     * @param prependLength If {@code true} then the list is preceded by
-     *                      a 32-bit count of the number of members in the list
-     * @see #putStringList(Collection, Charset, boolean)
-     */
-    public void putStringList(Collection<?> objects, boolean prependLength) {
-        putStringList(objects, StandardCharsets.UTF_8, prependLength);
-    }
-
-    /**
-     * Encodes the {@link Objects#toString(Object, String) toString} value of each member
-     *
-     * @param objects       The objects to be encoded in the buffer - OK if
-     *                      {@code null}/empty
-     * @param charset       The {@link Charset} to use for encoding
-     * @param prependLength If {@code true} then the list is preceded by
-     *                      a 32-bit count of the number of members in the list
-     * @see #putString(String, Charset)
-     */
-    public void putStringList(Collection<?> objects, Charset charset, boolean prependLength) {
-        int numObjects = GenericUtils.size(objects);
-        if (prependLength) {
-            putInt(numObjects);
-        }
-
-        if (numObjects <= 0) {
-            return;
-        }
-
-        objects.forEach(o -> putString(Objects.toString(o, null), charset));
-    }
-
-    public void putString(String string) {
-        putString(string, StandardCharsets.UTF_8);
-    }
-
-    public void putString(String string, Charset charset) {
-        if (GenericUtils.isEmpty(string)) {
-            putBytes(GenericUtils.EMPTY_BYTE_ARRAY);
-        } else {
-            putBytes(string.getBytes(charset));
-        }
-    }
-
-    /**
-     * Zeroes the input array <U>after</U> having put the characters in the
-     * buffer - useful for sensitive information such as passwords
-     *
-     * @param chars The characters to put in the buffer - may be {@code null}/empty
-     * @see #putAndWipeChars(char[], Charset)
-     * @see #putChars(char[], Charset)
-     */
-    public void putAndWipeChars(char[] chars) {
-        putAndWipeChars(chars, 0, GenericUtils.length(chars));
-    }
-
-    public void putAndWipeChars(char[] chars, int offset, int len) {
-        putAndWipeChars(chars, offset, len, StandardCharsets.UTF_8);
-    }
-
-    public void putAndWipeChars(char[] chars, Charset charset) {
-        putAndWipeChars(chars, 0, GenericUtils.length(chars), charset);
-    }
-
-    public void putAndWipeChars(char[] chars, int offset, int len, Charset charset) {
-        putChars(chars, offset, len, charset);
-        for (int pos = offset, index = 0; index < len; index++, pos++) {
-            chars[pos] = '\0';
-        }
-    }
-
-    public void putChars(char[] chars) {
-        putChars(chars, 0, GenericUtils.length(chars));
-    }
-
-    public void putChars(char[] chars, int offset, int len) {
-        putChars(chars, offset, len, StandardCharsets.UTF_8);
-    }
-
-    public void putChars(char[] chars, Charset charset) {
-        putChars(chars, 0, GenericUtils.length(chars), charset);
-    }
-
-    public void putChars(char[] chars, int offset, int len, Charset charset) {
-        if (len <= 0) {
-            putBytes(GenericUtils.EMPTY_BYTE_ARRAY);
-        } else {
-            putBuffer(charset.encode(CharBuffer.wrap(chars, offset, len)));
-        }
-    }
-
-    public void putMPInt(BigInteger bi) {
-        putMPInt(bi.toByteArray());
-    }
-
-    public void putMPInt(byte[] foo) {
-        if ((foo[0] & 0x80) != 0) {
-            putInt(foo.length + 1 /* padding */);
-            putByte((byte) 0);
-        } else {
-            putInt(foo.length);
-        }
-        putRawBytes(foo);
-    }
-
-    public void putRawBytes(byte[] d) {
-        putRawBytes(d, 0, d.length);
-    }
-
-    public abstract void putRawBytes(byte[] d, int off, int len);
-
-    public void putPublicKey(PublicKey key) {
-        int ow = wpos();
-        putInt(0);
-        int ow1 = wpos();
-        putRawPublicKey(key);
-        int ow2 = wpos();
-        wpos(ow);
-        putInt(ow2 - ow1);
-        wpos(ow2);
-    }
-
-    public void putRawPublicKey(PublicKey key) {
-        Objects.requireNonNull(key, "No key");
-        if (key instanceof RSAPublicKey) {
-            RSAPublicKey rsaPub = (RSAPublicKey) key;
-
-            putString(KeyPairProvider.SSH_RSA);
-            putMPInt(rsaPub.getPublicExponent());
-            putMPInt(rsaPub.getModulus());
-        } else if (key instanceof DSAPublicKey) {
-            DSAPublicKey dsaPub = (DSAPublicKey) key;
-            DSAParams dsaParams = dsaPub.getParams();
-
-            putString(KeyPairProvider.SSH_DSS);
-            putMPInt(dsaParams.getP());
-            putMPInt(dsaParams.getQ());
-            putMPInt(dsaParams.getG());
-            putMPInt(dsaPub.getY());
-        } else if (key instanceof ECPublicKey) {
-            ECPublicKey ecKey = (ECPublicKey) key;
-            ECParameterSpec ecParams = ecKey.getParams();
-            ECCurves curve = ECCurves.fromCurveParameters(ecParams);
-            if (curve == null) {
-                throw new BufferException("Unsupported EC curve parameters");
-            }
-
-            putString(curve.getKeyType());
-            putString(curve.getName());
-            putBytes(ECCurves.encodeECPoint(ecKey.getW(), ecParams));
-        } else if (SecurityUtils.EDDSA.equals(key.getAlgorithm())) {
-            SecurityUtils.putRawEDDSAPublicKey(this, key);
-        } else {
-            throw new BufferException("Unsupported raw public key algorithm: " + key.getAlgorithm());
-        }
-    }
-
-    public void putKeyPair(KeyPair kp) {
-        PublicKey pubKey = kp.getPublic();
-        PrivateKey prvKey = kp.getPrivate();
-        if (prvKey instanceof RSAPrivateCrtKey) {
-            RSAPublicKey rsaPub = (RSAPublicKey) pubKey;
-            RSAPrivateCrtKey rsaPrv = (RSAPrivateCrtKey) prvKey;
-
-            putString(KeyPairProvider.SSH_RSA);
-            putMPInt(rsaPub.getPublicExponent());
-            putMPInt(rsaPub.getModulus());
-            putMPInt(rsaPrv.getPrivateExponent());
-            putMPInt(rsaPrv.getCrtCoefficient());
-            putMPInt(rsaPrv.getPrimeQ());
-            putMPInt(rsaPrv.getPrimeP());
-        } else if (pubKey instanceof DSAPublicKey) {
-            DSAPublicKey dsaPub = (DSAPublicKey) pubKey;
-            DSAParams dsaParams = dsaPub.getParams();
-            DSAPrivateKey dsaPrv = (DSAPrivateKey) prvKey;
-
-            putString(KeyPairProvider.SSH_DSS);
-            putMPInt(dsaParams.getP());
-            putMPInt(dsaParams.getQ());
-            putMPInt(dsaParams.getG());
-            putMPInt(dsaPub.getY());
-            putMPInt(dsaPrv.getX());
-        } else if (pubKey instanceof ECPublicKey) {
-            ECPublicKey ecPub = (ECPublicKey) pubKey;
-            ECPrivateKey ecPriv = (ECPrivateKey) prvKey;
-            ECParameterSpec ecParams = ecPub.getParams();
-            ECCurves curve = ECCurves.fromCurveParameters(ecParams);
-            if (curve == null) {
-                throw new BufferException("Unsupported EC curve parameters");
-            }
-
-            putString(curve.getKeyType());
-            putString(curve.getName());
-            putBytes(ECCurves.encodeECPoint(ecPub.getW(), ecParams));
-            putMPInt(ecPriv.getS());
-        } else if (SecurityUtils.EDDSA.equals(pubKey.getAlgorithm())) {
-            SecurityUtils.putEDDSAKeyPair(this, pubKey, prvKey);
-        } else {
-            throw new BufferException("Unsupported key pair algorithm: " + pubKey.getAlgorithm());
-        }
-    }
-
-    protected void ensureCapacity(int capacity) {
-        ensureCapacity(capacity, BufferUtils.DEFAULT_BUFFER_GROWTH_FACTOR);
-    }
-
-    /**
-     * @param capacity     The requires capacity
-     * @param growthFactor An {@link IntUnaryOperator} that is invoked
-     *                     if the current capacity is insufficient. The argument is the minimum
-     *                     required new data length, the function result should be the
-     *                     effective new data length to be allocated - if less than minimum
-     *                     then an exception is thrown
-     */
-    public abstract void ensureCapacity(int capacity, IntUnaryOperator growthFactor);
-
-    protected abstract int size();
-
-    @Override
-    public String toString() {
-        return "Buffer [rpos=" + rpos() + ", wpos=" + wpos() + ", size=" + size() + "]";
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/BufferException.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/BufferException.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/BufferException.java
deleted file mode 100644
index 93f4e6b..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/BufferException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.buffer;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class BufferException extends RuntimeException {
-    private static final long serialVersionUID = 658645233475011039L;
-
-    public BufferException(String message) {
-        super(message);
-    }
-}
\ No newline at end of file