Moved NamedThreadFactory and ByteArrayWrapper to util project. Changed try/catch with hashing files in Crypto.Util
This commit is contained in:
parent
c66c1d43df
commit
e6ab2bef0e
42
Dorkbox-Util/src/dorkbox/util/NamedThreadFactory.java
Normal file
42
Dorkbox-Util/src/dorkbox/util/NamedThreadFactory.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package dorkbox.util;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadFactory;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default thread factory with names.
|
||||||
|
*/
|
||||||
|
public class NamedThreadFactory implements ThreadFactory {
|
||||||
|
private static final AtomicInteger poolId = new AtomicInteger();
|
||||||
|
// permit this to be changed!
|
||||||
|
/**
|
||||||
|
* Stack size must be specified in bytes. Default is 8k
|
||||||
|
*/
|
||||||
|
public static int stackSizeForNettyThreads = 8192;
|
||||||
|
|
||||||
|
private final AtomicInteger nextId = new AtomicInteger();
|
||||||
|
|
||||||
|
final ThreadGroup group;
|
||||||
|
final String namePrefix;
|
||||||
|
|
||||||
|
public NamedThreadFactory(String poolNamePrefix, ThreadGroup group) {
|
||||||
|
this.group = group;
|
||||||
|
namePrefix = poolNamePrefix + '-' + poolId.incrementAndGet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Thread newThread(Runnable r) {
|
||||||
|
// stack size is arbitrary based on JVM implementation. Default is 0
|
||||||
|
// 8k is the size of the android stack. Depending on the version of android, this can either change, or will always be 8k
|
||||||
|
// To be honest, 8k is pretty reasonable for an asynchronous/event based system (32bit) or 16k (64bit)
|
||||||
|
// Setting the size MAY or MAY NOT have any effect!!!
|
||||||
|
Thread t = new Thread(group, r, namePrefix + '-' + nextId.incrementAndGet(), stackSizeForNettyThreads);
|
||||||
|
if (!t.isDaemon()) {
|
||||||
|
t.setDaemon(true);
|
||||||
|
}
|
||||||
|
if (t.getPriority() != Thread.MAX_PRIORITY) {
|
||||||
|
t.setPriority(Thread.MAX_PRIORITY);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
37
Dorkbox-Util/src/dorkbox/util/bytes/ByteArrayWrapper.java
Normal file
37
Dorkbox-Util/src/dorkbox/util/bytes/ByteArrayWrapper.java
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package dorkbox.util.bytes;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Necessary to provide equals and hashcode methods on a byte arrays, if they are to be used as keys in a map/set/etc
|
||||||
|
*/
|
||||||
|
public final class ByteArrayWrapper {
|
||||||
|
private final byte[] data;
|
||||||
|
|
||||||
|
public ByteArrayWrapper(byte[] data) {
|
||||||
|
if (data == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
int length = data.length;
|
||||||
|
this.data = new byte[length];
|
||||||
|
// copy so it's immutable as a key.
|
||||||
|
System.arraycopy(data, 0, this.data, 0, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getBytes() {
|
||||||
|
return this.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if (!(other instanceof ByteArrayWrapper)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return Arrays.equals(this.data, ((ByteArrayWrapper) other).data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Arrays.hashCode(this.data);
|
||||||
|
}
|
||||||
|
}
|
@ -106,23 +106,24 @@ public class Crypto {
|
|||||||
/**
|
/**
|
||||||
* Return the hash of the file or NULL if file is invalid
|
* Return the hash of the file or NULL if file is invalid
|
||||||
*/
|
*/
|
||||||
public static final byte[] hashFile(File file, Digest digest) throws IOException {
|
public static final byte[] hashFile(File file, Digest digest) {
|
||||||
return hashFile(file, digest, 0L);
|
return hashFile(file, digest, 0L);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the hash of the file or NULL if file is invalid
|
* Return the hash of the file or NULL if file is invalid
|
||||||
*/
|
*/
|
||||||
public static final byte[] hashFile(File file, Digest digest, long lengthFromEnd) throws IOException {
|
public static final byte[] hashFile(File file, Digest digest, long lengthFromEnd) {
|
||||||
if (file.isFile() && file.canRead()) {
|
if (file.isFile() && file.canRead()) {
|
||||||
InputStream inputStream = new FileInputStream(file);
|
InputStream inputStream = null;
|
||||||
long size = file.length();
|
|
||||||
|
|
||||||
if (lengthFromEnd > 0 && lengthFromEnd < size) {
|
|
||||||
size -= lengthFromEnd;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
inputStream = new FileInputStream(file);
|
||||||
|
long size = file.length();
|
||||||
|
|
||||||
|
if (lengthFromEnd > 0 && lengthFromEnd < size) {
|
||||||
|
size -= lengthFromEnd;
|
||||||
|
}
|
||||||
|
|
||||||
int bufferSize = 4096;
|
int bufferSize = 4096;
|
||||||
byte[] buffer = new byte[bufferSize];
|
byte[] buffer = new byte[bufferSize];
|
||||||
|
|
||||||
@ -141,8 +142,16 @@ public class Crypto {
|
|||||||
|
|
||||||
digest.update(buffer, 0, readBytes);
|
digest.update(buffer, 0, readBytes);
|
||||||
}
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.error("Error hashing file: {}", file.getAbsolutePath(), e);
|
||||||
} finally {
|
} finally {
|
||||||
inputStream.close();
|
if (inputStream != null) {
|
||||||
|
try {
|
||||||
|
inputStream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] digestBytes = new byte[digest.getDigestSize()];
|
byte[] digestBytes = new byte[digest.getDigestSize()];
|
||||||
@ -793,13 +802,13 @@ public class Crypto {
|
|||||||
try {
|
try {
|
||||||
actualLength += aesEngine.doFinal(outBuf, actualLength);
|
actualLength += aesEngine.doFinal(outBuf, actualLength);
|
||||||
} catch (DataLengthException e) {
|
} catch (DataLengthException e) {
|
||||||
logger.error("Unable to perform AES cipher.", e);
|
logger.debug("Unable to perform AES cipher.", e);
|
||||||
return new byte[0];
|
return new byte[0];
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
logger.error("Unable to perform AES cipher.", e);
|
logger.debug("Unable to perform AES cipher.", e);
|
||||||
return new byte[0];
|
return new byte[0];
|
||||||
} catch (InvalidCipherTextException e) {
|
} catch (InvalidCipherTextException e) {
|
||||||
logger.error("Unable to perform AES cipher.", e);
|
logger.debug("Unable to perform AES cipher.", e);
|
||||||
return new byte[0];
|
return new byte[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user