You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2015/07/17 18:18:33 UTC
[13/25] mina-sshd git commit: [SSHD-542] Checkstyle validation
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/Base64.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/Base64.java b/sshd-core/src/main/java/org/apache/sshd/common/util/Base64.java
index 7a897c7..8b3b3cb 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/Base64.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/Base64.java
@@ -1,21 +1,20 @@
/*
- * 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
+ * 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.
+ * 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;
@@ -24,24 +23,24 @@ import java.security.InvalidParameterException;
/**
* Provides Base64 encoding and decoding as defined by RFC 2045.
+ * <p/>
+ * <p>This class implements section <cite>6.8. Base64 Content-Transfer-Encoding</cite>
+ * from RFC 2045 <cite>Multipurpose Internet Mail Extensions (MIME) Part One:
+ * Format of Internet Message Bodies</cite> by Freed and Borenstein.</p>
*
- * <p>This class implements section <cite>6.8. Base64 Content-Transfer-Encoding</cite>
- * from RFC 2045 <cite>Multipurpose Internet Mail Extensions (MIME) Part One:
- * Format of Internet Message Bodies</cite> by Freed and Borenstein.</p>
- *
- * @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>
- *
- * This class was
* @author Apache Software Foundation commons codec (http://commons.apache.org/codec/)
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
- * TODO replace this class with {@code java.util.Base64} when upgrading to JDK 1.8
+ * TODO replace this class with {@code java.util.Base64} when upgrading to JDK 1.8
+ * @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>
+ * <p/>
+ * This class was
*/
public class Base64 {
/**
* Chunk size per RFC 2045 section 6.8.
- *
- * <p>The {@value} character limit does not count the trailing CRLF, but counts
+ * <p/>
+ * <p>The {@value} character limit does not count the trailing CRLF, but counts
* all other characters, including any equal signs.</p>
*
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 6.8</a>
@@ -136,13 +135,7 @@ public class Base64 {
}
private static boolean isBase64(byte octect) {
- if (octect == PAD) {
- return true;
- } else if (base64Alphabet[octect] == -1) {
- return false;
- } else {
- return true;
- }
+ return octect == PAD || base64Alphabet[octect] != -1;
}
/**
@@ -151,7 +144,7 @@ public class Base64 {
*
* @param arrayOctect byte array to test
* @return true if all bytes are valid characters in the Base64
- * alphabet or if the byte array is empty; false, otherwise
+ * alphabet or if the byte array is empty; false, otherwise
*/
public static boolean isArrayByteBase64(byte[] arrayOctect) {
@@ -170,7 +163,7 @@ public class Base64 {
return true;
}
- public static String encodeToString(byte ... bytes) {
+ public static String encodeToString(byte... bytes) {
return new String(encodeBase64(bytes), StandardCharsets.UTF_8);
}
@@ -203,10 +196,10 @@ public class Base64 {
* supplied object is not of type byte[].
*
* @param pObject Object to decode
- * @return An object (of type byte[]) containing the
- * binary data which corresponds to the byte[] supplied.
+ * @return An object (of type byte[]) containing the
+ * binary data which corresponds to the byte[] supplied.
* @throws InvalidParameterException if the parameter supplied is not
- * of type byte[]
+ * of type byte[]
*/
public Object decode(Object pObject) {
if (!(pObject instanceof byte[])) {
@@ -231,8 +224,8 @@ public class Base64 {
* chunking the output into 76 character blocks.
*
* @param binaryData Array containing binary data to encode.
- * @param isChunked if isChunked is true this encoder will chunk
- * the base64 output into 76 character blocks
+ * @param isChunked if isChunked is true this encoder will chunk
+ * the base64 output into 76 character blocks
* @return Base64-encoded data.
*/
public static byte[] encodeBase64(byte[] binaryData, boolean isChunked) {
@@ -256,17 +249,21 @@ public class Base64 {
// allow for extra length to account for the separator(s)
if (isChunked) {
- nbrChunks = (CHUNK_SEPARATOR.length == 0 ? 0 : (int) Math.ceil((float) encodedDataLength / CHUNK_SIZE));
+ nbrChunks = CHUNK_SEPARATOR.length == 0 ? 0 : (int) Math.ceil((float) encodedDataLength / CHUNK_SIZE);
encodedDataLength += nbrChunks * CHUNK_SEPARATOR.length;
}
encodedData = new byte[encodedDataLength];
- byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
+ byte k;
+ byte l;
+ byte b1;
+ byte b2;
+ byte b3;
int encodedIndex = 0;
- int dataIndex = 0;
- int i = 0;
+ int dataIndex;
+ int i;
int nextSeparatorIndex = CHUNK_SIZE;
int chunksSoFar = 0;
@@ -279,9 +276,9 @@ public class Base64 {
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
- byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
- byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
+ byte val1 = (b1 & SIGN) == 0 ? (byte) (b1 >> 2) : (byte) (b1 >> 2 ^ 0xc0);
+ byte val2 = (b2 & SIGN) == 0 ? (byte) (b2 >> 4) : (byte) (b2 >> 4 ^ 0xf0);
+ byte val3 = (b3 & SIGN) == 0 ? (byte) (b3 >> 6) : (byte) (b3 >> 6 ^ 0xfc);
encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | (k << 4)];
@@ -308,7 +305,7 @@ public class Base64 {
if (fewerThan24bits == EIGHTBIT) {
b1 = binaryData[dataIndex];
k = (byte) (b1 & 0x03);
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+ byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) (b1 >> 2 ^ 0xc0);
encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[k << 4];
encodedData[encodedIndex + 2] = PAD;
@@ -320,8 +317,8 @@ public class Base64 {
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
- byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
- byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
+ byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) (b1 >> 2 ^ 0xc0);
+ byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) (b2 >> 4 ^ 0xf0);
encodedData[encodedIndex] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[val2 | (k << 4)];
@@ -365,23 +362,27 @@ public class Base64 {
int numberQuadruple = base64Data.length / FOURBYTE;
byte decodedData[];
- byte b1, b2, b3, b4, marker0, marker1;
+ byte b1;
+ byte b2;
+ byte b3;
+ byte b4;
+ byte marker0;
+ byte marker1;
// Throw away anything not in base64Data
int encodedIndex = 0;
int dataIndex;
- {
- // this sizes the output array properly - rlw
- int lastData = base64Data.length;
- // ignore the '=' padding
- while (base64Data[lastData - 1] == PAD) {
- if (--lastData == 0) {
- return GenericUtils.EMPTY_BYTE_ARRAY;
- }
+
+ // this sizes the output array properly - rlw
+ int lastData = base64Data.length;
+ // ignore the '=' padding
+ while (base64Data[lastData - 1] == PAD) {
+ if (--lastData == 0) {
+ return GenericUtils.EMPTY_BYTE_ARRAY;
}
- decodedData = new byte[lastData - numberQuadruple];
}
+ decodedData = new byte[lastData - numberQuadruple];
for (int i = 0; i < numberQuadruple; i++) {
dataIndex = i * 4;
@@ -418,7 +419,7 @@ public class Base64 {
* Discards any whitespace from a base-64 encoded block.
*
* @param data The base-64 encoded data to discard the whitespace
- * from.
+ * from.
* @return The data, less whitespace (see RFC 2045).
*/
static byte[] discardWhitespace(byte[] data) {
@@ -451,7 +452,7 @@ public class Base64 {
* encoded data."
*
* @param data The base-64 encoded data to groom
- * @return The data, less non-base64 characters (see RFC 2045) -
+ * @return The data, less non-base64 characters (see RFC 2045) -
* may be same as input if all data was base-64
*/
public static byte[] discardNonBase64(byte[] data) {
@@ -475,7 +476,8 @@ public class Base64 {
if (groomedData == null) {
groomedData = new byte[data.length - 1 /* the current character, which is NOT BASE64 */];
- if ((bytesCopied=i) > 0) {
+ bytesCopied = i;
+ if (bytesCopied > 0) {
System.arraycopy(data, 0, groomedData, 0, bytesCopied);
}
}
@@ -509,10 +511,10 @@ public class Base64 {
* supplied object is not of type byte[].
*
* @param pObject Object to encode
- * @return An object (of type byte[]) containing the
- * base64 encoded data which corresponds to the byte[] supplied.
+ * @return An object (of type byte[]) containing the
+ * base64 encoded data which corresponds to the byte[] supplied.
* @throws InvalidParameterException if the parameter supplied is not
- * of type byte[]
+ * of type byte[]
*/
public Object encode(Object pObject) {
if (!(pObject instanceof byte[])) {
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/CloseableUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/CloseableUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/CloseableUtils.java
index 2acda50..6b81aae 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/CloseableUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/CloseableUtils.java
@@ -43,8 +43,12 @@ import org.apache.sshd.common.util.logging.AbstractLoggingBean;
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
public final class CloseableUtils {
+
+ /**
+ * Private Constructor
+ */
private CloseableUtils() {
- throw new UnsupportedOperationException("No instance");
+ throw new UnsupportedOperationException("No instance allowed");
}
// TODO once JDK 8+ becomes the minimum for this project, make it a static method in the Closeable interface
@@ -54,7 +58,7 @@ public final class CloseableUtils {
}
if ((!closeable.isClosed()) && (!closeable.isClosing())) {
- CloseFuture future=closeable.close(true);
+ CloseFuture future = closeable.close(true);
future.await(); // TODO use verify + configurable timeout
}
}
@@ -65,7 +69,7 @@ public final class CloseableUtils {
return future;
}
- public static class Builder implements ObjectBuilder<Closeable> {
+ public static final class Builder implements ObjectBuilder<Closeable> {
private final Object lock;
private final List<Closeable> closeables = new ArrayList<Closeable>();
@@ -150,11 +154,11 @@ public final class CloseableUtils {
}
- public static abstract class IoBaseCloseable extends AbstractLoggingBean implements Closeable {
+ public abstract static class IoBaseCloseable extends AbstractLoggingBean implements Closeable {
protected IoBaseCloseable() {
super();
}
-
+
protected IoBaseCloseable(String discriminator) {
super(discriminator);
}
@@ -162,11 +166,7 @@ public final class CloseableUtils {
// TODO once JDK 8+ becomes the minimum for this project, make it a default method instead of this class
@Override
public boolean isOpen() {
- if (isClosed() || isClosing()) {
- return false;
- } else {
- return true;
- }
+ return !(isClosed() || isClosing());
}
// TODO once JDK 8+ becomes the minimum for this project, make it a default method instead of this class
@@ -190,10 +190,12 @@ public final class CloseableUtils {
public boolean isClosed() {
return future.isClosed();
}
+
@Override
public boolean isClosing() {
return closing.get();
}
+
@Override
public CloseFuture close(boolean immediately) {
if (closing.compareAndSet(false, true)) {
@@ -207,7 +209,7 @@ public final class CloseableUtils {
}
}
- private static class ParallelCloseable extends SimpleCloseable {
+ private static final class ParallelCloseable extends SimpleCloseable {
private final Iterable<? extends Closeable> closeables;
@@ -308,16 +310,23 @@ public final class CloseableUtils {
}
}
- public static abstract class AbstractCloseable extends IoBaseCloseable {
+ public abstract static class AbstractCloseable extends IoBaseCloseable {
protected enum State {
Opened, Graceful, Immediate, Closed
}
- /** Lock object for this session state */
+
+ /**
+ * Lock object for this session state
+ */
protected final Object lock = new Object();
- /** State of this object */
+ /**
+ * State of this object
+ */
protected final AtomicReference<State> state = new AtomicReference<>(State.Opened);
- /** A future that will be set 'closed' when the object is actually closed */
+ /**
+ * A future that will be set 'closed' when the object is actually closed
+ */
protected final CloseFuture closeFuture = new DefaultCloseFuture(lock);
protected AbstractCloseable() {
@@ -394,7 +403,7 @@ public final class CloseableUtils {
/**
* doCloseImmediately is called once and only once
* with state == Immediate
- *
+ * <p/>
* Overriding methods should always call the base implementation.
* It may be called concurrently while preClose() or doCloseGracefully is executing
*/
@@ -410,9 +419,7 @@ public final class CloseableUtils {
}
- public static abstract class AbstractInnerCloseable extends AbstractCloseable {
-
- protected abstract Closeable getInnerCloseable();
+ public abstract static class AbstractInnerCloseable extends AbstractCloseable {
protected AbstractInnerCloseable() {
super();
@@ -422,6 +429,8 @@ public final class CloseableUtils {
super(discriminator);
}
+ protected abstract Closeable getInnerCloseable();
+
@Override
protected CloseFuture doCloseGracefully() {
return getInnerCloseable().close(false);
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/DirectoryScanner.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/DirectoryScanner.java b/sshd-core/src/main/java/org/apache/sshd/common/util/DirectoryScanner.java
index 95ab94d..f6f9c14 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/DirectoryScanner.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/DirectoryScanner.java
@@ -25,12 +25,12 @@ import java.util.List;
/**
* <p>Class for scanning a directory for files/directories which match certain
* criteria.</p>
- *
+ * <p/>
* <p>These criteria consist of selectors and patterns which have been specified.
* With the selectors you can select which files you want to have included.
* Files which are not selected are excluded. With patterns you can include
* or exclude files based on their filename.</p>
- *
+ * <p/>
* <p>The idea is simple. A given directory is recursively scanned for all files
* and directories. Each file/directory is matched against a set of selectors,
* including special support for matching against filenames with include and
@@ -38,12 +38,12 @@ import java.util.List;
* pattern of the include pattern list or other file selector, and don't match
* any pattern of the exclude pattern list or fail to match against a required
* selector will be placed in the list of files/directories found.</p>
- *
+ * <p/>
* <p>When no list of include patterns is supplied, "**" will be used, which
* means that everything will be matched. When no list of exclude patterns is
* supplied, an empty list is used, such that nothing will be excluded. When
* no selectors are supplied, none are applied.</p>
- *
+ * <p/>
* <p>The filename pattern matching is done as follows:
* The name to be matched is split up in path segments. A path segment is the
* name of a directory or file, which is bounded by
@@ -51,11 +51,11 @@ import java.util.List;
* For example, "abc/def/ghi/xyz.java" is split up in the segments "abc",
* "def","ghi" and "xyz.java".
* The same is done for the pattern against which should be matched.</p>
- *
+ * <p/>
* <p>The segments of the name and the pattern are then matched against each
* other. When '**' is used for a path segment in the pattern, it matches
* zero or more path segments of the name.</p>
- *
+ * <p/>
* <p>There is a special case regarding the use of <code>File.separator</code>s
* at the beginning of the pattern and the string to match:<br>
* When a pattern starts with a <code>File.separator</code>, the string
@@ -64,12 +64,12 @@ import java.util.List;
* string to match may not start with a <code>File.separator</code>.
* When one of these rules is not obeyed, the string will not
* match.</p>
- *
+ * <p/>
* <p>When a name path segment is matched against a pattern path segment, the
* following special characters can be used:<br>
* '*' matches zero or more characters<br>
* '?' matches one character.</p>
- *
+ * <p/>
* <p>Examples:
* <br>
* <code>"**\*.class"</code> matches all <code>.class</code> files/dirs in a directory tree.
@@ -82,10 +82,10 @@ import java.util.List;
* <code>"**\test\**\XYZ*"</code> matches all files/dirs which start with <code>"XYZ"</code> and where
* there is a parent directory called test (e.g. <code>"abc\test\def\ghi\XYZ123"</code>).
* </p>
- *
+ * <p/>
* <p>Case sensitivity may be turned off if necessary. By default, it is
* turned on.</p>
- *
+ * <p/>
* <p>Example of usage:</p>
* <pre>
* String[] includes = {"**\\*.class"};
@@ -182,7 +182,7 @@ public class DirectoryScanner {
* <p>Sets the list of include patterns to use. All '/' and '\' characters
* are replaced by <code>File.separatorChar</code>, so the separator used
* need not match <code>File.separatorChar</code>.</p>
- *
+ * <p/>
* <p>When a pattern ends with a '/' or '\', "**" is appended.</p>
*
* @param includes A list of include patterns.
@@ -276,7 +276,7 @@ public class DirectoryScanner {
* The names are relative to the base directory.
*
* @return the names of the files which matched at least one of the
- * include patterns and none of the exclude patterns.
+ * include patterns and none of the exclude patterns.
*/
public String[] getIncludedFiles() {
String[] files = new String[filesIncluded.size()];
@@ -290,7 +290,7 @@ public class DirectoryScanner {
*
* @param name The name to match. Must not be {@code null}.
* @return <code>true</code> when the name matches against at least one
- * include pattern, or <code>false</code> otherwise.
+ * include pattern, or <code>false</code> otherwise.
*/
protected boolean isIncluded(String name) {
for (String include : includes) {
@@ -307,7 +307,7 @@ public class DirectoryScanner {
*
* @param name The name to match. Must not be {@code null}.
* @return <code>true</code> when the name matches against the start of at
- * least one include pattern, or <code>false</code> otherwise.
+ * least one include pattern, or <code>false</code> otherwise.
*/
protected boolean couldHoldIncluded(String name) {
for (String include : includes) {
@@ -347,7 +347,7 @@ public class DirectoryScanner {
/**
* <p>Replace a String with another String inside a larger String,
* for the first <code>max</code> values of the search String.</p>
- *
+ * <p/>
* <p>A {@code null} reference passed to this method is a no-op.</p>
*
* @param text text to search and replace in
@@ -362,7 +362,8 @@ public class DirectoryScanner {
}
StringBuilder buf = new StringBuilder(text.length());
- int start = 0, end;
+ int start = 0;
+ int end;
while ((end = text.indexOf(repl, start)) != -1) {
buf.append(text.substring(start, end)).append(with);
start = end + repl.length();
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java
index d18efc4..8d17799 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/GenericUtils.java
@@ -36,23 +36,36 @@ import java.util.TreeSet;
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
public final class GenericUtils {
- public static final byte[] EMPTY_BYTE_ARRAY = { };
- public static final String[] EMPTY_STRING_ARRAY = { };
- public static final Object[] EMPTY_OBJECT_ARRAY = { };
-
+
+ public static final byte[] EMPTY_BYTE_ARRAY = {};
+ public static final String[] EMPTY_STRING_ARRAY = {};
+ public static final Object[] EMPTY_OBJECT_ARRAY = {};
+
/**
* The complement of {@link String#CASE_INSENSITIVE_ORDER}
*/
public static final Comparator<String> CASE_SENSITIVE_ORDER = new Comparator<String>() {
- @Override
- public int compare(String s1, String s2) {
- if (s1 == s2) {
- return 0;
- } else {
- return s1.compareTo(s2);
- }
+ @Override
+ public int compare(String s1, String s2) {
+ if (s1 == s2) {
+ return 0;
+ } else {
+ return s1.compareTo(s2);
}
- };
+ }
+ };
+
+ public static final String QUOTES = "\"'";
+
+ @SuppressWarnings("rawtypes")
+ private static final Comparator<Comparable> NATURAL_ORDER_COMPARATOR = new Comparator<Comparable>() {
+ // TODO for JDK-8 use Comparator.naturalOrder()
+ @Override
+ @SuppressWarnings("unchecked")
+ public int compare(Comparable c1, Comparable c2) {
+ return c1.compareTo(c2);
+ }
+ };
private GenericUtils() {
throw new UnsupportedOperationException("No instance");
@@ -70,9 +83,9 @@ public final class GenericUtils {
if (s1 == s2) {
return 0;
} else if (s1 == null) {
- return (+1); // push null(s) to end
+ return +1; // push null(s) to end
} else if (s2 == null) {
- return (-1); // push null(s) to end
+ return -1; // push null(s) to end
} else if (caseSensitive) {
return s1.compareTo(s2);
} else {
@@ -81,19 +94,11 @@ public final class GenericUtils {
}
public static int length(CharSequence cs) {
- if (cs == null) {
- return 0;
- } else {
- return cs.length();
- }
+ return cs == null ? 0 : cs.length();
}
public static boolean isEmpty(CharSequence cs) {
- if (length(cs) <= 0) {
- return true;
- } else {
- return false;
- }
+ return length(cs) <= 0;
}
// a List would be better, but we want to be compatible with String.split(...)
@@ -101,30 +106,33 @@ public final class GenericUtils {
if (isEmpty(s)) {
return EMPTY_STRING_ARRAY;
}
-
- int lastPos=0, curPos=s.indexOf(ch);
+
+ int lastPos = 0;
+ int curPos = s.indexOf(ch);
if (curPos < 0) {
- return new String[] { s };
+ return new String[]{s};
}
-
- Collection<String> values=new LinkedList<String>();
+
+ Collection<String> values = new LinkedList<>();
do {
- String v=s.substring(lastPos, curPos);
+ String v = s.substring(lastPos, curPos);
values.add(v);
-
+
// skip separator
- if ((lastPos = curPos + 1) >= s.length()) {
+ lastPos = curPos + 1;
+ if (lastPos >= s.length()) {
break;
}
-
- if ((curPos = s.indexOf(ch, lastPos)) < lastPos) {
+
+ curPos = s.indexOf(ch, lastPos);
+ if (curPos < lastPos) {
break; // no more separators
}
- } while(curPos < s.length());
-
+ } while (curPos < s.length());
+
// check if any leftovers
if (lastPos < s.length()) {
- String v=s.substring(lastPos);
+ String v = s.substring(lastPos);
values.add(v);
}
@@ -138,21 +146,21 @@ public final class GenericUtils {
public static String join(Iterable<?> iter, char ch) {
return join((iter == null) ? null : iter.iterator(), ch);
}
-
+
public static String join(Iterator<?> iter, char ch) {
if ((iter == null) || (!iter.hasNext())) {
return "";
}
-
- StringBuilder sb=new StringBuilder();
+
+ StringBuilder sb = new StringBuilder();
do { // we already asked hasNext...
- Object o=iter.next();
+ Object o = iter.next();
if (sb.length() > 0) {
sb.append(ch);
}
sb.append(Objects.toString(o));
- } while(iter.hasNext());
-
+ } while (iter.hasNext());
+
return sb.toString();
}
@@ -163,79 +171,51 @@ public final class GenericUtils {
public static String join(Iterable<?> iter, CharSequence sep) {
return join((iter == null) ? null : iter.iterator(), sep);
}
-
+
public static String join(Iterator<?> iter, CharSequence sep) {
if ((iter == null) || (!iter.hasNext())) {
return "";
}
-
- StringBuilder sb=new StringBuilder();
+
+ StringBuilder sb = new StringBuilder();
do { // we already asked hasNext...
- Object o=iter.next();
+ Object o = iter.next();
if (sb.length() > 0) {
sb.append(sep);
}
sb.append(Objects.toString(o));
- } while(iter.hasNext());
-
+ } while (iter.hasNext());
+
return sb.toString();
}
-
+
public static int size(Collection<?> c) {
- if (c == null) {
- return 0;
- } else {
- return c.size();
- }
+ return c == null ? 0 : c.size();
}
public static boolean isEmpty(Collection<?> c) {
- if (size(c) <= 0) {
- return true;
- } else {
- return false;
- }
+ return size(c) <= 0;
}
- public static int size(Map<?,?> m) {
- if (m == null) {
- return 0;
- } else {
- return m.size();
- }
+ public static int size(Map<?, ?> m) {
+ return m == null ? 0 : m.size();
}
- public static boolean isEmpty(Map<?,?> m) {
- if (size(m) <= 0) {
- return true;
- } else {
- return false;
- }
+ public static boolean isEmpty(Map<?, ?> m) {
+ return size(m) <= 0;
}
public static boolean isEmpty(byte[] a) {
- if (length(a) <= 0) {
- return true;
- } else {
- return false;
- }
+ return length(a) <= 0;
}
- public static int length(byte ... a) {
- if (a == null) {
- return 0;
- } else {
- return a.length;
- }
+ public static int length(byte... a) {
+ return a == null ? 0 : a.length;
}
@SafeVarargs
- public static <T> int length(T ... a) {
- if (a == null) {
- return 0;
- } else {
- return a.length;
- }
+ public static <T> int length(T... a) {
+ return a == null ? 0 : a.length;
}
public static <T> boolean isEmpty(Iterable<? extends T> iter) {
@@ -249,26 +229,16 @@ public final class GenericUtils {
}
public static <T> boolean isEmpty(Iterator<? extends T> iter) {
- if (iter == null) {
- return true;
- } else if (iter.hasNext()) {
- return false; // debug breakpoint
- } else {
- return true;
- }
+ return iter == null || !iter.hasNext();
}
@SafeVarargs
- public static <T> boolean isEmpty(T ... a) {
- if (length(a) <= 0) {
- return true;
- } else {
- return false;
- }
+ public static <T> boolean isEmpty(T... a) {
+ return length(a) <= 0;
}
@SafeVarargs // there is no EnumSet.of(...) so we have to provide our own
- public static <E extends Enum<E>> Set<E> of(E ... values) {
+ public static <E extends Enum<E>> Set<E> of(E... values) {
return of(isEmpty(values) ? Collections.<E>emptySet() : Arrays.asList(values));
}
@@ -277,7 +247,7 @@ public final class GenericUtils {
return Collections.emptySet();
}
- Set<E> result=null;
+ Set<E> result = null;
for (E v : values) {
/*
* A trick to compensate for the fact that we do not have
@@ -293,20 +263,10 @@ public final class GenericUtils {
return result;
}
- @SuppressWarnings("rawtypes")
- private static final Comparator<Comparable> naturalOrderComparator=new Comparator<Comparable>() {
- // TODO for JDK-8 use Comparator.naturalOrder()
- @Override
- @SuppressWarnings("unchecked")
- public int compare(Comparable c1, Comparable c2) {
- return c1.compareTo(c2);
- }
- };
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
+ @SuppressWarnings({"unchecked", "rawtypes"})
public static <V extends Comparable<V>> Comparator<V> naturalComparator() {
// TODO for JDK-8 use Comparator.naturalOrder()
- return (Comparator) naturalOrderComparator;
+ return (Comparator) NATURAL_ORDER_COMPARATOR;
}
public static <V extends Comparable<V>> SortedSet<V> asSortedSet(Collection<? extends V> values) {
@@ -315,22 +275,19 @@ public final class GenericUtils {
}
/**
- * @param comp The (non-{@code null}) {@link Comparator} to use
+ * @param comp The (non-{@code null}) {@link Comparator} to use
* @param values The values to be added (ignored if {@code null))
* @return A {@link SortedSet} containing the values (if any) sorted
* using the provided comparator
*/
public static <V> SortedSet<V> asSortedSet(Comparator<? super V> comp, Collection<? extends V> values) {
// TODO for JDK-8 return Collections.emptySortedSet()
- SortedSet<V> set=new TreeSet<V>(ValidateUtils.checkNotNull(comp, "No comparator"));
+ SortedSet<V> set = new TreeSet<V>(ValidateUtils.checkNotNull(comp, "No comparator"));
if (size(values) > 0) {
set.addAll(values);
}
-
return set;
}
-
- public static final String QUOTES="\"'";
/**
* @param s The {@link CharSequence} to be checked
@@ -339,24 +296,24 @@ public final class GenericUtils {
* nothing is done
* @see #stripDelimiters(CharSequence, char)
*/
- public static CharSequence stripQuotes(CharSequence s) {
+ public static CharSequence stripQuotes(CharSequence s) {
if (isEmpty(s)) {
return s;
}
-
- for (int index=0; index < QUOTES.length(); index++) {
+
+ for (int index = 0; index < QUOTES.length(); index++) {
char delim = QUOTES.charAt(index);
CharSequence v = stripDelimiters(s, delim);
if (v != s) { // if stripped one don't continue
return v;
}
}
-
+
return s;
}
/**
- * @param s The {@link CharSequence} to be checked
+ * @param s The {@link CharSequence} to be checked
* @param delim The expected delimiter
* @return If the sequence contains the delimiter on <U>both</U> ends,
* then it is are stripped, otherwise nothing is done
@@ -365,7 +322,7 @@ public final class GenericUtils {
if (isEmpty(s) || (s.length() < 2)) {
return s;
}
-
+
int lastPos = s.length() - 1;
if ((s.charAt(0) != delim) || (s.charAt(lastPos) != delim)) {
return s;
@@ -373,7 +330,7 @@ public final class GenericUtils {
return s.subSequence(1, lastPos);
}
}
-
+
/**
* @param t The original {@link Throwable} - ignored if {@code null}
* @return If {@link Throwable#getCause()} is non-{@code null} then
@@ -384,7 +341,7 @@ public final class GenericUtils {
if (t == null) {
return t;
}
-
+
Throwable c = t.getCause();
if (c == null) {
return t;
@@ -398,8 +355,9 @@ public final class GenericUtils {
* current exception is {@code null} then the new one becomes the current,
* otherwise the new one is added as a <U>suppressed</U> exception to the
* current one
+ *
* @param current The current exception
- * @param extra The extra/new exception
+ * @param extra The extra/new exception
* @return The resolved exception
* @see Throwable#addSuppressed(Throwable)
*/
@@ -407,18 +365,18 @@ public final class GenericUtils {
if (current == null) {
return extra;
}
-
+
if ((extra == null) || (extra == current)) {
return current;
}
-
+
current.addSuppressed(extra);
return current;
}
// TODO in JDK-8 use Long.hashCode(long)
public static int hashCode(long value) {
- return (int)(value ^ (value >>> 32));
+ return (int) (value ^ (value >>> 32));
}
}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/Int2IntFunction.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/Int2IntFunction.java b/sshd-core/src/main/java/org/apache/sshd/common/util/Int2IntFunction.java
index 68b1588..ffaaef6 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/Int2IntFunction.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/Int2IntFunction.java
@@ -23,25 +23,27 @@ package org.apache.sshd.common.util;
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
public interface Int2IntFunction {
+
+ /**
+ * An {@link Int2IntFunction} that returns same value as input
+ */
+ Int2IntFunction IDENTITY = new Int2IntFunction() {
+ @Override
+ public int apply(int value) {
+ return value;
+ }
+ };
+
/**
* @param value Argument
* @return Function result
*/
int apply(int value);
- /**
- * An {@link Int2IntFunction} that returns same value as input
- */
- Int2IntFunction IDENTITY = new Int2IntFunction() {
- @Override
- public int apply(int value) {
- return value;
- }
- };
+ final class Utils {
- public static final class Utils {
private Utils() {
- throw new UnsupportedOperationException("No instance");
+ throw new UnsupportedOperationException("No instance allowed");
}
public static Int2IntFunction sub(int delta) {
@@ -60,7 +62,7 @@ public interface Int2IntFunction {
};
}
}
-
+
public static Int2IntFunction mul(final int factor) {
if (factor == 1) {
return IDENTITY;
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/ObjectBuilder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/ObjectBuilder.java b/sshd-core/src/main/java/org/apache/sshd/common/util/ObjectBuilder.java
index fd3fce3..9072b03 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/ObjectBuilder.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/ObjectBuilder.java
@@ -21,10 +21,11 @@ package org.apache.sshd.common.util;
/**
* A generic builder interface
+ *
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
public interface ObjectBuilder<T> {
- T build();
+ T build();
}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/OsUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/OsUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/OsUtils.java
index 529899c..0319fd9 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/OsUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/OsUtils.java
@@ -24,24 +24,30 @@ package org.apache.sshd.common.util;
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
public final class OsUtils {
- private static final boolean win32;
+
+ private static final boolean WIN32;
+
+ private OsUtils() {
+ throw new UnsupportedOperationException("No instance allowed");
+ }
static {
String os = System.getProperty("os.name").toLowerCase();
- win32 = os.contains("windows");
+ WIN32 = os.contains("windows");
}
- /** @return true if the host is a UNIX system (and not Windows). */
+ /**
+ * @return true if the host is a UNIX system (and not Windows).
+ */
public static boolean isUNIX() {
- return !win32;
+ return !WIN32;
}
- /** @return true if the host is Windows (and not UNIX). */
+ /**
+ * @return true if the host is Windows (and not UNIX).
+ */
public static boolean isWin32() {
- return win32;
+ return WIN32;
}
- private OsUtils () {
- throw new UnsupportedOperationException("No instance allowed");
- }
}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/Pair.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/Pair.java b/sshd-core/src/main/java/org/apache/sshd/common/util/Pair.java
index 21e23d6..c580dc5 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/Pair.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/Pair.java
@@ -22,9 +22,10 @@ import java.util.Objects;
/**
* Represents a pair of values
+ *
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public class Pair<U,V> {
+public class Pair<U, V> {
private final U first;
private final V second;
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java
index 38ccf45..d93460c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java
@@ -34,7 +34,6 @@ import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Signature;
import java.util.concurrent.Callable;
-
import javax.crypto.Cipher;
import javax.crypto.KeyAgreement;
import javax.crypto.Mac;
@@ -64,12 +63,12 @@ import org.slf4j.LoggerFactory;
*
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
-public class SecurityUtils {
+public final class SecurityUtils {
public static final String BOUNCY_CASTLE = "BC";
private static final Logger LOG = LoggerFactory.getLogger(SecurityUtils.class);
- private static String securityProvider = null;
+ private static String securityProvider;
private static Boolean registerBouncyCastle;
private static boolean registrationDone;
private static Boolean hasEcc;
@@ -157,12 +156,12 @@ public class SecurityUtils {
}
/* -------------------------------------------------------------------- */
-
+
// TODO in JDK-8 make this an interface...
private static class BouncyCastleInputStreamLoader {
public static KeyPair loadKeyPair(String resourceKey, InputStream inputStream, FilePasswordProvider provider)
throws IOException, GeneralSecurityException {
- try(PEMParser r = new PEMParser(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
+ try (PEMParser r = new PEMParser(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
Object o = r.readObject();
JcaPEMKeyConverter pemConverter = new JcaPEMKeyConverter();
@@ -170,14 +169,14 @@ public class SecurityUtils {
if (o instanceof PEMEncryptedKeyPair) {
ValidateUtils.checkNotNull(provider, "No password provider for resource=%s", resourceKey);
- String password = ValidateUtils.checkNotNullAndNotEmpty(provider.getPassword(resourceKey), "No password provided for resource=%s", resourceKey);
+ String password = ValidateUtils.checkNotNullAndNotEmpty(provider.getPassword(resourceKey), "No password provided for resource=%s", resourceKey);
JcePEMDecryptorProviderBuilder decryptorBuilder = new JcePEMDecryptorProviderBuilder();
PEMDecryptorProvider pemDecryptor = decryptorBuilder.build(password.toCharArray());
o = ((PEMEncryptedKeyPair) o).decryptKeyPair(pemDecryptor);
}
if (o instanceof PEMKeyPair) {
- return pemConverter.getKeyPair((PEMKeyPair)o);
+ return pemConverter.getKeyPair((PEMKeyPair) o);
} else if (o instanceof KeyPair) {
return (KeyPair) o;
} else {
@@ -189,34 +188,34 @@ public class SecurityUtils {
/**
* @param resourceKey An identifier of the key being loaded - used as
- * argument to the {@link FilePasswordProvider#getPassword(String)}
- * invocation
+ * argument to the {@link FilePasswordProvider#getPassword(String)}
+ * invocation
* @param inputStream The {@link InputStream} for the <U>private</U> key
- * @param provider A {@link FilePasswordProvider} - may be {@code null}
- * if the loaded key is <U>guaranteed</U> not to be encrypted
+ * @param provider A {@link FilePasswordProvider} - may be {@code null}
+ * if the loaded key is <U>guaranteed</U> not to be encrypted
* @return The loaded {@link KeyPair}
- * @throws IOException If failed to read/parse the input stream
+ * @throws IOException If failed to read/parse the input stream
* @throws GeneralSecurityException If failed to generate the keys - specifically,
- * {@link NoSuchProviderException} is thrown also if {@link #isBouncyCastleRegistered()}
- * is {@code false}
+ * {@link NoSuchProviderException} is thrown also if {@link #isBouncyCastleRegistered()}
+ * is {@code false}
*/
public static KeyPair loadKeyPairIdentity(String resourceKey, InputStream inputStream, FilePasswordProvider provider)
throws IOException, GeneralSecurityException {
if (!isBouncyCastleRegistered()) {
throw new NoSuchProviderException("BouncyCastle not registered");
}
-
+
return BouncyCastleInputStreamLoader.loadKeyPair(resourceKey, inputStream, provider);
}
/* -------------------------------------------------------------------- */
// use a separate class in order to avoid direct dependency
- private static class BouncyCastleFileKeyPairProvider extends AbstractFileKeyPairProvider {
+ private static final class BouncyCastleFileKeyPairProvider extends AbstractFileKeyPairProvider {
private BouncyCastleFileKeyPairProvider() {
ValidateUtils.checkTrue(isBouncyCastleRegistered(), "BouncyCastle not registered");
}
-
+
@Override
protected KeyPair doLoadKey(String resourceKey, InputStream inputStream, FilePasswordProvider provider)
throws IOException, GeneralSecurityException {
@@ -231,7 +230,7 @@ public class SecurityUtils {
/* -------------------------------------------------------------------- */
- private static class BouncyCastleClassLoadableResourceKeyPairProvider extends AbstractClassLoadableResourceKeyPairProvider {
+ private static final class BouncyCastleClassLoadableResourceKeyPairProvider extends AbstractClassLoadableResourceKeyPairProvider {
private BouncyCastleClassLoadableResourceKeyPairProvider() {
ValidateUtils.checkTrue(isBouncyCastleRegistered(), "BouncyCastle not registered");
}
@@ -250,7 +249,7 @@ public class SecurityUtils {
/* -------------------------------------------------------------------- */
- private static class BouncyCastleGeneratorHostKeyProvider extends AbstractGeneratorHostKeyProvider {
+ private static final class BouncyCastleGeneratorHostKeyProvider extends AbstractGeneratorHostKeyProvider {
private BouncyCastleGeneratorHostKeyProvider(Path path) {
ValidateUtils.checkTrue(isBouncyCastleRegistered(), "BouncyCastle not registered");
setPath(path);
@@ -264,25 +263,25 @@ public class SecurityUtils {
@SuppressWarnings("deprecation")
@Override
protected void doWriteKeyPair(String resourceKey, KeyPair kp, OutputStream outputStream) throws IOException, GeneralSecurityException {
- try(org.bouncycastle.openssl.PEMWriter w =
- new org.bouncycastle.openssl.PEMWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))) {
+ try (org.bouncycastle.openssl.PEMWriter w =
+ new org.bouncycastle.openssl.PEMWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))) {
w.writeObject(kp);
w.flush();
}
}
}
-
+
@SuppressWarnings("synthetic-access")
public static AbstractGeneratorHostKeyProvider createGeneratorHostKeyProvider(Path path) {
- return new BouncyCastleGeneratorHostKeyProvider(path );
+ return new BouncyCastleGeneratorHostKeyProvider(path);
}
/* -------------------------------------------------------------------- */
-
+
/**
* Named factory for the BouncyCastle <code>Random</code>
*/
- private static class BouncyCastleRandomFactory implements RandomFactory {
+ private static final class BouncyCastleRandomFactory implements RandomFactory {
private static final BouncyCastleRandomFactory INSTANCE = new BouncyCastleRandomFactory();
private BouncyCastleRandomFactory() {
@@ -313,7 +312,7 @@ public class SecurityUtils {
*
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
- private static class BouncyCastleRandom extends AbstractRandom {
+ private static final class BouncyCastleRandom extends AbstractRandom {
private final RandomGenerator random;
@@ -337,27 +336,28 @@ public class SecurityUtils {
public int random(int n) {
if (n > 0) {
if ((n & -n) == n) {
- return (int)((n * (long) next(31)) >> 31);
+ return (int) ((n * (long) next(31)) >> 31);
}
- int bits, val;
+ int bits;
+ int val;
do {
bits = next(31);
val = bits % n;
- } while (bits - val + (n-1) < 0);
+ } while (bits - val + (n - 1) < 0);
return val;
}
throw new IllegalArgumentException("Limit must be positive: " + n);
}
- final protected int next(int numBits) {
- int bytes = (numBits+7)/8;
+ private int next(int numBits) {
+ int bytes = (numBits + 7) / 8;
byte next[] = new byte[bytes];
int ret = 0;
random.nextBytes(next);
for (int i = 0; i < bytes; i++) {
ret = (next[i] & 0xFF) | (ret << 8);
}
- return ret >>> (bytes*8 - numBits);
+ return ret >>> (bytes * 8 - numBits);
}
}
@@ -400,7 +400,7 @@ public class SecurityUtils {
public static synchronized MessageDigest getMessageDigest(String algorithm) throws GeneralSecurityException {
register();
-
+
String providerName = getSecurityProvider();
if (GenericUtils.isEmpty(providerName)) {
return MessageDigest.getInstance(algorithm);
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/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
index 2ac0976..f38a75b 100644
--- 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
@@ -59,7 +59,7 @@ public final class SelectorUtils {
/**
* <p>Tests whether or not a given path matches the start of a given
* pattern up to the first "**".</p>
- *
+ * <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>
@@ -69,7 +69,7 @@ public final class SelectorUtils {
* @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 "**".
+ * pattern up to the first "**".
*/
public static boolean matchPatternStart(String pattern, String str) {
return matchPatternStart(pattern, str, true);
@@ -78,7 +78,7 @@ public final class SelectorUtils {
/**
* <p>Tests whether or not a given path matches the start of a given
* pattern up to the first "**".</p>
- *
+ * <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>
@@ -90,7 +90,7 @@ public final class SelectorUtils {
* @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 "**".
+ * pattern up to the first "**".
*/
public static boolean matchPatternStart(String pattern, String str,
boolean isCaseSensitive) {
@@ -118,8 +118,7 @@ public final class SelectorUtils {
// File.separator.
// When pattern starts with a File.separator, str has to start with a
// File.separator.
- if (str.startsWith(separator) !=
- pattern.startsWith(separator)) {
+ if (str.startsWith(separator) != pattern.startsWith(separator)) {
return false;
}
@@ -145,6 +144,7 @@ public final class SelectorUtils {
strIdxStart++;
}
+ // CHECKSTYLE:OFF
if (strIdxStart > strIdxEnd) {
// String is exhausted
return true;
@@ -156,6 +156,7 @@ public final class SelectorUtils {
// this will generate false positives but we can live with that.
return true;
}
+ // CHECKSTYLE:ON
}
/**
@@ -166,7 +167,7 @@ public final class SelectorUtils {
* @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.
+ * or <code>false</code> otherwise.
*/
public static boolean matchPath(String pattern, String str) {
return matchPath(pattern, str, true);
@@ -182,7 +183,7 @@ public final class SelectorUtils {
* @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.
+ * or <code>false</code> otherwise.
*/
public static boolean matchPath(String pattern, String str,
boolean isCaseSensitive) {
@@ -208,8 +209,7 @@ public final class SelectorUtils {
// 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)) {
+ if (str.startsWith(File.separator) != pattern.startsWith(File.separator)) {
return false;
}
@@ -297,8 +297,8 @@ public final class SelectorUtils {
}
// Find the pattern between padIdxStart & padIdxTmp in str between
// strIdxStart & strIdxEnd
- int patLength = (patIdxTmp - patIdxStart - 1);
- int strLength = (strIdxEnd - strIdxStart + 1);
+ int patLength = patIdxTmp - patIdxStart - 1;
+ int strLength = strIdxEnd - strIdxStart + 1;
int foundIdx = -1;
strLoop:
for (int i = 0; i <= strLength - patLength; i++) {
@@ -346,7 +346,7 @@ public final class SelectorUtils {
* @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.
+ * or <code>false</code> otherwise.
*/
public static boolean match(String pattern, String str) {
return match(pattern, str, true);
@@ -365,7 +365,7 @@ public final class SelectorUtils {
* @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.
+ * or <code>false</code> otherwise.
*/
public static boolean match(String pattern, String str,
boolean isCaseSensitive) {
@@ -404,6 +404,7 @@ public final class SelectorUtils {
}
// Process characters before first star
+ // CHECKSTYLE:OFF
while ((ch = patArr[patIdxStart]) != '*' && strIdxStart <= strIdxEnd) {
if (ch != '?' && !equals(ch, strArr[strIdxStart], isCaseSensitive)) {
return false; // Character mismatch
@@ -411,6 +412,7 @@ public final class SelectorUtils {
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.
@@ -423,6 +425,7 @@ public final class SelectorUtils {
}
// Process characters after last star
+ // CHECKSTYLE:OFF
while ((ch = patArr[patIdxEnd]) != '*' && strIdxStart <= strIdxEnd) {
if (ch != '?' && !equals(ch, strArr[strIdxEnd], isCaseSensitive)) {
return false; // Character mismatch
@@ -430,6 +433,7 @@ public final class SelectorUtils {
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.
@@ -458,8 +462,8 @@ public final class SelectorUtils {
}
// Find the pattern between padIdxStart & padIdxTmp in str between
// strIdxStart & strIdxEnd
- int patLength = (patIdxTmp - patIdxStart - 1);
- int strLength = (strIdxEnd - strIdxStart + 1);
+ int patLength = patIdxTmp - patIdxStart - 1;
+ int strLength = strIdxEnd - strIdxStart + 1;
int foundIdx = -1;
strLoop:
for (int i = 0; i <= strLength - patLength; i++) {
@@ -501,8 +505,8 @@ public final class SelectorUtils {
}
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)) {
+ if (Character.toUpperCase(c1) == Character.toUpperCase(c2)
+ || Character.toLowerCase(c1) == Character.toLowerCase(c2)) {
return true;
}
}
@@ -529,11 +533,12 @@ public final class SelectorUtils {
return ret;
}
-
+
/**
* Normalizes the path by removing '.', '..' and double separators (e.g. '//')
- * @param path Original path - ignored if {@code null}/empty
- * @param separator The separator used for the path components
+ *
+ * @param path Original path - ignored if {@code null}/empty
+ * @param separator The separator used for the path components
* @return normalized path
* @throws IOException when the path is invalid (e.g. '/first/../..')
*/
@@ -592,6 +597,7 @@ public final class SelectorUtils {
* 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 "C:\"
+ *
* @param path The original path - ignored if {@code null}/empty
* @return The local path
*/
@@ -599,9 +605,9 @@ public final class SelectorUtils {
if (GenericUtils.isEmpty(path) || (File.separatorChar == '/')) {
return path;
}
-
+
// This code is reached if we are running on Windows
- String localPath=path.replace('/', File.separatorChar);
+ String localPath = path.replace('/', File.separatorChar);
if ((localPath.length() < 2) || (localPath.charAt(1) != ':')) {
return localPath; // assume a relative path
}
@@ -626,14 +632,10 @@ public final class SelectorUtils {
if ((GenericUtils.length(cs) < 2) || (cs.charAt(1) != ':')) {
return false;
}
-
- char drive=cs.charAt(0);
- if (((drive >= 'a') && (drive <= 'z'))
- || ((drive >= 'A') && (drive <= 'Z'))) {
- return true;
- } else {
- return false;
- }
+
+ char drive = cs.charAt(0);
+ return ((drive >= 'a') && (drive <= 'z'))
+ || ((drive >= 'A') && (drive <= 'Z'));
}
/**
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/util/Transformer.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/Transformer.java b/sshd-core/src/main/java/org/apache/sshd/common/util/Transformer.java
index 19ba9c4..73e2233 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/Transformer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/Transformer.java
@@ -26,33 +26,51 @@ import java.util.Objects;
*/
public interface Transformer<I, O> {
// TODO in JDK-8 replace this with Function
+
/**
- * @param input Input value
- * @return Transformed output value
+ * Invokes {@link Objects#toString(Object)} on the argument
*/
- O transform(I input);
+ Transformer<Object, String> TOSTRING = new Transformer<Object, String>() {
+ @Override
+ public String transform(Object input) {
+ return Objects.toString(input);
+ }
+ };
/**
- * Invokes {@link Objects#toString(Object)} on the argument
+ * Returns {@link Enum#name()} or {@code null} if argument is {@code null}
*/
- Transformer<Object,String> TOSTRING=new Transformer<Object,String>() {
- @Override
- public String transform(Object input) {
- return Objects.toString(input);
+ Transformer<Enum<?>, String> ENUM_NAME_EXTRACTOR = new Transformer<Enum<?>, String>() {
+ @Override
+ public String transform(Enum<?> input) {
+ if (input == null) {
+ return null;
+ } else {
+ return input.name();
}
- };
+ }
+ };
/**
- * Returns {@link Enum#name()} or {@code null} if argument is {@code null}
+ * @param input Input value
+ * @return Transformed output value
*/
- Transformer<Enum<?>,String> ENUM_NAME_EXTRACTOR=new Transformer<Enum<?>,String>() {
- @Override
- public String transform(Enum<?> input) {
- if (input == null) {
- return null;
- } else {
- return input.name();
+ O transform(I input);
+
+ final class Utils {
+
+ private Utils() {
+ throw new UnsupportedOperationException("No instance allowed");
+ }
+
+ public static <U extends V, V> Transformer<U, V> identity() {
+ return new Transformer<U, V>() {
+ @Override
+ public V transform(U input) {
+ return input;
}
- }
- };
+ };
+ }
+
+ }
}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/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
index 097c986..26b154b 100644
--- 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
@@ -40,7 +40,7 @@ public final class ValidateUtils {
return t;
}
- public static <T> T checkNotNull(T t, String message, Object ... args) {
+ public static <T> T checkNotNull(T t, String message, Object... args) {
checkTrue(t != null, message, args);
return t;
}
@@ -57,31 +57,31 @@ public final class ValidateUtils {
return t;
}
- public static String checkNotNullAndNotEmpty(String t, String message, Object ... args) {
+ 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) {
+ 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) {
+ 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 byte[] checkNotNullAndNotEmpty(byte[] t, String message, Object ... args) {
+ public static byte[] checkNotNullAndNotEmpty(byte[] t, String message, Object... args) {
t = checkNotNull(t, message, args);
checkTrue(GenericUtils.length(t) > 0, message, args);
return t;
}
- public static <T> T[] checkNotNullAndNotEmpty(T[] t, String message, Object ... args) {
+ 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;
@@ -99,13 +99,13 @@ public final class ValidateUtils {
}
}
- public static void checkTrue(boolean flag, String message, Object ... args) {
+ public static void checkTrue(boolean flag, String message, Object... args) {
if (!flag) {
throwIllegalArgumentException(message, args);
}
}
-
- public static void throwIllegalArgumentException(String message, Object ... args) {
+
+ public static void throwIllegalArgumentException(String message, Object... args) {
throw new IllegalArgumentException(String.format(message, args));
}
}
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/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
index b68a4a3..9cf4d92 100644
--- 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
@@ -61,12 +61,13 @@ import org.apache.sshd.common.util.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 {
// TODO use Long.BYTES in JDK-8
- protected final byte[] workBuf = new byte[Long.SIZE / Byte.SIZE];
+ protected final byte[] workBuf = new byte[Long.SIZE / Byte.SIZE];
protected Buffer() {
super();
@@ -77,6 +78,7 @@ public abstract class Buffer implements Readable {
======================*/
public abstract int rpos();
+
public abstract void rpos(int rpos);
public abstract int wpos();
@@ -84,6 +86,7 @@ public abstract class Buffer implements Readable {
public abstract void wpos(int wpos);
public abstract int capacity();
+
public abstract byte[] array();
public abstract void compact();
@@ -124,9 +127,8 @@ public abstract class Buffer implements Readable {
// TODO use Short.BYTES for JDK-8
ensureAvailable(Short.SIZE / Byte.SIZE);
getRawBytes(workBuf, 0, Short.SIZE / Byte.SIZE);
- short v = (short) (((workBuf[1] << Byte.SIZE) & 0xFF00)
- | ((workBuf[0] ) & 0xF))
- ;
+ short v = (short) ((workBuf[1] << Byte.SIZE) & 0xFF00);
+ v |= workBuf[0] & 0xF;
return v;
}
@@ -146,14 +148,14 @@ public abstract class Buffer implements Readable {
ensureAvailable(Long.SIZE / Byte.SIZE);
getRawBytes(workBuf, 0, Long.SIZE / Byte.SIZE);
@SuppressWarnings("cast")
- long l = (((long) workBuf[0] << 56) & 0xff00000000000000L)|
- (((long) workBuf[1] << 48) & 0x00ff000000000000L)|
- (((long) workBuf[2] << 40) & 0x0000ff0000000000L)|
- (((long) workBuf[3] << 32) & 0x000000ff00000000L)|
- (((long) workBuf[4] << 24) & 0x00000000ff000000L)|
- (((long) workBuf[5] << 16) & 0x0000000000ff0000L)|
- (((long) workBuf[6] << 8) & 0x000000000000ff00L)|
- (((long) workBuf[7] ) & 0x00000000000000ffL);
+ 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 |= ((long) workBuf[7]) & 0x00000000000000ffL;
return l;
}
@@ -167,9 +169,9 @@ public abstract class Buffer implements Readable {
/**
* @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 "greedy" reading of strings while more
- * data available
+ * value indicating the number of strings to read. Otherwise, the
+ * method will use a "greedy" reading of strings while more
+ * data available
* @return A {@link Collection} of the read strings
* @see #getStringList(boolean, Charset)
*/
@@ -179,13 +181,13 @@ public abstract class Buffer implements Readable {
/**
* @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 "greedy" reading of strings while more
- * data available
- * @param charset The {@link Charset} to use for the string
+ * value indicating the number of strings to read. Otherwise, the
+ * method will use a "greedy" 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 {@link #getStringList(int, Charset)}
- * @see {@link #getAvailableStrings()}
+ * @see {@link #getAvailableStrings()}
*/
public Collection<String> getStringList(boolean usePrependedLength, Charset charset) {
if (usePrependedLength) {
@@ -212,11 +214,11 @@ public abstract class Buffer implements Readable {
*/
public Collection<String> getAvailableStrings(Charset charset) {
Collection<String> list = new LinkedList<String>();
- while(available() > 0) {
+ while (available() > 0) {
String s = getString(charset);
list.add(s);
}
-
+
return list;
}
@@ -230,7 +232,7 @@ public abstract class Buffer implements Readable {
}
/**
- * @param count The <U>exact</V> number of strings to read - can be zero
+ * @param count The <U>exact</V> 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
*/
@@ -238,16 +240,16 @@ public abstract class Buffer implements Readable {
if (count == 0) {
return Collections.emptyList();
}
-
+
List<String> list = new ArrayList<String>(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() {
@@ -300,7 +302,7 @@ public abstract class Buffer implements Readable {
KeyFactory keyFactory = SecurityUtils.getKeyFactory("DSA");
return keyFactory.generatePublic(new DSAPublicKeySpec(y, p, q, g));
}
-
+
ECCurves curve = ECCurves.fromKeyType(keyAlg);
if (curve == null) {
throw new NoSuchAlgorithmException("Unsupported raw public algorithm: " + keyAlg);
@@ -328,11 +330,11 @@ public abstract class Buffer implements Readable {
ECPoint w;
try {
w = ECDSAPublicKeyEntryDecoder.octetStringToEcPoint(octets);
- } catch(RuntimeException e) {
+ } catch (RuntimeException e) {
throw new InvalidKeySpecException("getRawECKey(" + expectedCurve + ")"
- + " cannot (" + e.getClass().getSimpleName() + ")"
- + " retrieve W value: " + e.getMessage(),
- e);
+ + " cannot (" + e.getClass().getSimpleName() + ")"
+ + " retrieve W value: " + e.getMessage(),
+ e);
}
KeyFactory keyFactory = SecurityUtils.getKeyFactory("EC");
@@ -366,7 +368,7 @@ public abstract class Buffer implements Readable {
pub = keyFactory.generatePublic(new DSAPublicKeySpec(y, p, q, g));
prv = keyFactory.generatePrivate(new DSAPrivateKeySpec(x, p, q, g));
} else {
- ECCurves curve = ECCurves.fromKeyType(keyAlg);
+ ECCurves curve = ECCurves.fromKeyType(keyAlg);
if (curve == null) {
throw new NoSuchAlgorithmException("Unsupported key pair algorithm: " + keyAlg);
}
@@ -397,11 +399,11 @@ public abstract class Buffer implements Readable {
ECPoint group;
try {
group = ECDSAPublicKeyEntryDecoder.octetStringToEcPoint(groupBytes);
- } catch(RuntimeException e) {
+ } catch (RuntimeException e) {
throw new InvalidKeySpecException("extractEC(" + expectedCurveName + ")"
- + " failed (" + e.getClass().getSimpleName() + ")"
- + " to decode EC group for curve: " + e.getMessage(),
- e);
+ + " failed (" + e.getClass().getSimpleName() + ")"
+ + " to decode EC group for curve: " + e.getMessage(),
+ e);
}
KeyFactory keyFactory = SecurityUtils.getKeyFactory("EC");
@@ -435,18 +437,20 @@ public abstract class Buffer implements Readable {
/**
* Writes 16 bits
+ *
* @param i
*/
public void putShort(int i) {
// TODO use Short.BYTES for JDK-8
ensureCapacity(Short.SIZE / Byte.SIZE);
- workBuf[0] = (byte) (i >> 8);
- workBuf[1] = (byte) (i );
+ workBuf[0] = (byte) (i >> 8);
+ workBuf[1] = (byte) i;
putRawBytes(workBuf, 0, Short.SIZE / Byte.SIZE);
}
/**
* Writes 32 bits
+ *
* @param i The 32-bit value
*/
public void putInt(long i) {
@@ -458,6 +462,7 @@ public abstract class Buffer implements Readable {
/**
* Writes 64 bits
+ *
* @param i
*/
public void putLong(long i) {
@@ -469,8 +474,8 @@ public abstract class Buffer implements Readable {
workBuf[3] = (byte) (i >> 32);
workBuf[4] = (byte) (i >> 24);
workBuf[5] = (byte) (i >> 16);
- workBuf[6] = (byte) (i >> 8);
- workBuf[7] = (byte) (i );
+ workBuf[6] = (byte) (i >> 8);
+ workBuf[7] = (byte) i;
putRawBytes(workBuf, 0, Long.SIZE / Byte.SIZE);
}
@@ -489,10 +494,11 @@ public abstract class Buffer implements Readable {
/**
* Encodes the {@link Objects#toString(Object)} value of each member.
- * @param objects The objects to be encoded in the buffer - OK if
- * {@code null}/empty
+ *
+ * @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
+ * a 32-bit count of the number of members in the list
* @see #putStringList(Collection, Charset, boolean)
*/
public void putStringList(Collection<?> objects, boolean prependLength) {
@@ -501,11 +507,12 @@ public abstract class Buffer implements Readable {
/**
* Encodes the {@link Objects#toString(Object)} 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 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
+ * 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) {
@@ -517,7 +524,7 @@ public abstract class Buffer implements Readable {
if (numObjects <= 0) {
return;
}
-
+
for (Object o : objects) {
putString(Objects.toString(o), charset);
}
@@ -538,7 +545,7 @@ public abstract class Buffer implements Readable {
public void putMPInt(byte[] foo) {
if ((foo[0] & 0x80) != 0) {
putInt(foo.length + 1 /* padding */);
- putByte((byte)0);
+ putByte((byte) 0);
} else {
putInt(foo.length);
}
@@ -570,8 +577,8 @@ public abstract class Buffer implements Readable {
putMPInt(rsaPub.getPublicExponent());
putMPInt(rsaPub.getModulus());
} else if (key instanceof DSAPublicKey) {
- DSAPublicKey dsaPub = (DSAPublicKey) key;
- DSAParams dsaParams = dsaPub.getParams();
+ DSAPublicKey dsaPub = (DSAPublicKey) key;
+ DSAParams dsaParams = dsaPub.getParams();
putString(KeyPairProvider.SSH_DSS);
putMPInt(dsaParams.getP());
@@ -595,11 +602,11 @@ public abstract class Buffer implements Readable {
}
public void putKeyPair(KeyPair kp) {
- PublicKey pubKey = kp.getPublic();
- PrivateKey prvKey = kp.getPrivate();
+ PublicKey pubKey = kp.getPublic();
+ PrivateKey prvKey = kp.getPrivate();
if (prvKey instanceof RSAPrivateCrtKey) {
- RSAPublicKey rsaPub = (RSAPublicKey) pubKey;
- RSAPrivateCrtKey rsaPrv = (RSAPrivateCrtKey) prvKey;
+ RSAPublicKey rsaPub = (RSAPublicKey) pubKey;
+ RSAPrivateCrtKey rsaPrv = (RSAPrivateCrtKey) prvKey;
putString(KeyPairProvider.SSH_RSA);
putMPInt(rsaPub.getPublicExponent());
@@ -609,9 +616,9 @@ public abstract class Buffer implements Readable {
putMPInt(rsaPrv.getPrimeQ());
putMPInt(rsaPrv.getPrimeP());
} else if (pubKey instanceof DSAPublicKey) {
- DSAPublicKey dsaPub = (DSAPublicKey) pubKey;
- DSAParams dsaParams = dsaPub.getParams();
- DSAPrivateKey dsaPrv = (DSAPrivateKey) prvKey;
+ DSAPublicKey dsaPub = (DSAPublicKey) pubKey;
+ DSAParams dsaParams = dsaPub.getParams();
+ DSAPrivateKey dsaPrv = (DSAPrivateKey) prvKey;
putString(KeyPairProvider.SSH_DSS);
putMPInt(dsaParams.getP());
@@ -625,7 +632,7 @@ public abstract class Buffer implements Readable {
ECParameterSpec ecParams = ecPub.getParams();
ECCurves curve = ECCurves.fromCurveParameters(ecParams);
if (curve == null) {
- throw new BufferException("Unsupported EC curve parameters");
+ throw new BufferException("Unsupported EC curve parameters");
}
putString(curve.getKeyType());
@@ -642,14 +649,15 @@ public abstract class Buffer implements Readable {
}
/**
- * @param capacity The requires capacity
+ * @param capacity The requires capacity
* @param growthFactor An {@link Int2IntFunction} 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
+ * 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, Int2IntFunction growthFactor);
+
protected abstract int size();
@Override