Updated license info. Code cleanup
This commit is contained in:
parent
19409170a4
commit
bf9a83c2e2
|
@ -15,22 +15,20 @@
|
|||
*/
|
||||
package dorkbox.util;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.GenericArrayType;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.lang.reflect.TypeVariable;
|
||||
import java.lang.reflect.*;
|
||||
|
||||
public class ClassHelper {
|
||||
public
|
||||
class ClassHelper {
|
||||
|
||||
/**
|
||||
* Retrieves the generic type parameter for the PARENT (super) class of the specified class. This ONLY works
|
||||
* on parent classes because of how type erasure works in java!
|
||||
*
|
||||
* @param clazz class to get the parameter from
|
||||
* @param clazz class to get the parameter from
|
||||
* @param genericParameterToGet 0-based index of parameter as class to get
|
||||
*/
|
||||
public final static Class<?> getGenericParameterAsClassForSuperClass(Class<?> clazz, int genericParameterToGet) {
|
||||
public static
|
||||
Class<?> getGenericParameterAsClassForSuperClass(Class<?> clazz, int genericParameterToGet) {
|
||||
Class<?> classToCheck = clazz;
|
||||
|
||||
// case of multiple inheritance, we are trying to get the first available generic info
|
||||
|
@ -44,7 +42,8 @@ public class ClassHelper {
|
|||
if (actualTypeArguments.length > genericParameterToGet) {
|
||||
Class<?> rawTypeAsClass = ClassHelper.getRawTypeAsClass(actualTypeArguments[genericParameterToGet]);
|
||||
return rawTypeAsClass;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// record the parameters.
|
||||
|
||||
}
|
||||
|
@ -68,7 +67,8 @@ public class ClassHelper {
|
|||
if (actualTypeArguments.length > genericParameterToGet) {
|
||||
Class<?> rawTypeAsClass = ClassHelper.getRawTypeAsClass(actualTypeArguments[genericParameterToGet]);
|
||||
return rawTypeAsClass;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// record the parameters.
|
||||
|
||||
}
|
||||
|
@ -88,34 +88,39 @@ public class ClassHelper {
|
|||
/**
|
||||
* Return the class that is this type.
|
||||
*/
|
||||
public final static Class<?> getRawTypeAsClass(Type type) {
|
||||
public static
|
||||
Class<?> getRawTypeAsClass(Type type) {
|
||||
if (type instanceof Class) {
|
||||
Class<?> class1 = (Class<?>)type;
|
||||
Class<?> class1 = (Class<?>) type;
|
||||
|
||||
// if (class1.isArray()) {
|
||||
// System.err.println("CLASS IS ARRAY TYPE: SHOULD WE DO ANYTHING WITH IT? " + class1.getSimpleName());
|
||||
// return class1.getComponentType();
|
||||
// } else {
|
||||
return class1;
|
||||
return class1;
|
||||
// }
|
||||
} else if (type instanceof GenericArrayType) {
|
||||
}
|
||||
else if (type instanceof GenericArrayType) {
|
||||
// note: cannot have primitive types here, only objects that are arrays (byte[], Integer[], etc)
|
||||
Type type2 = ((GenericArrayType) type).getGenericComponentType();
|
||||
Class<?> rawType = getRawTypeAsClass(type2);
|
||||
|
||||
return Array.newInstance(rawType, 0).getClass();
|
||||
} else if (type instanceof ParameterizedType) {
|
||||
return Array.newInstance(rawType, 0)
|
||||
.getClass();
|
||||
}
|
||||
else if (type instanceof ParameterizedType) {
|
||||
// we cannot use parameterized types, because java can't go between classes and ptypes - and this
|
||||
// going "in-between" is the magic -- and value -- of this entire infrastructure.
|
||||
// return the type.
|
||||
|
||||
return (Class<?>) ((ParameterizedType) type).getRawType();
|
||||
return (Class<?>) ((ParameterizedType) type).getRawType();
|
||||
|
||||
// Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
|
||||
// return (Class<?>) actualTypeArguments[0];
|
||||
} else if (type instanceof TypeVariable) {
|
||||
}
|
||||
else if (type instanceof TypeVariable) {
|
||||
// we have a COMPLEX type parameter
|
||||
Type[] bounds = ((TypeVariable<?>)type).getBounds();
|
||||
Type[] bounds = ((TypeVariable<?>) type).getBounds();
|
||||
if (bounds.length > 0) {
|
||||
return getRawTypeAsClass(bounds[0]);
|
||||
}
|
||||
|
@ -126,10 +131,11 @@ public class ClassHelper {
|
|||
|
||||
/**
|
||||
* Check to see if clazz or interface directly has one of the interfaces defined by clazzItMustHave
|
||||
* <p>
|
||||
* <p/>
|
||||
* If the class DOES NOT directly have the interface it will fail. the PARENT class is not checked.
|
||||
*/
|
||||
public final static boolean hasInterface(Class<?> clazzItMustHave, Class<?> clazz) {
|
||||
public static
|
||||
boolean hasInterface(Class<?> clazzItMustHave, Class<?> clazz) {
|
||||
if (clazzItMustHave == clazz) {
|
||||
return true;
|
||||
}
|
||||
|
@ -151,10 +157,12 @@ public class ClassHelper {
|
|||
|
||||
/**
|
||||
* Checks to see if the clazz is a subclass of a parent class.
|
||||
*
|
||||
* @param baseClass
|
||||
* @param genericClass
|
||||
*/
|
||||
public static boolean hasParentClass(Class<?> parentClazz, Class<?> clazz) {
|
||||
public static
|
||||
boolean hasParentClass(Class<?> parentClazz, Class<?> clazz) {
|
||||
Class<?> superClass = clazz.getSuperclass();
|
||||
if (parentClazz == superClass) {
|
||||
return true;
|
||||
|
|
|
@ -18,17 +18,61 @@ package dorkbox.util;
|
|||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
|
||||
|
||||
public class CountingLatch {
|
||||
public
|
||||
class CountingLatch {
|
||||
private final Sync sync;
|
||||
|
||||
|
||||
public
|
||||
CountingLatch() {
|
||||
this.sync = new Sync();
|
||||
}
|
||||
|
||||
public
|
||||
CountingLatch(final int initialCount) {
|
||||
this.sync = new Sync(initialCount);
|
||||
}
|
||||
|
||||
public
|
||||
void increment() {
|
||||
this.sync.releaseShared(1);
|
||||
}
|
||||
|
||||
public
|
||||
int getCount() {
|
||||
return this.sync.getCount();
|
||||
}
|
||||
|
||||
public
|
||||
void decrement() {
|
||||
this.sync.releaseShared(-1);
|
||||
}
|
||||
|
||||
public
|
||||
void await() throws InterruptedException {
|
||||
this.sync.acquireSharedInterruptibly(1);
|
||||
}
|
||||
|
||||
public
|
||||
boolean await(final long timeout) throws InterruptedException {
|
||||
return this.sync.tryAcquireSharedNanos(1, TimeUnit.MILLISECONDS.toNanos(timeout));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Synchronization control for CountingLatch. Uses AQS state to represent
|
||||
* count.
|
||||
*/
|
||||
private static final class Sync extends AbstractQueuedSynchronizer {
|
||||
private static final
|
||||
class Sync extends AbstractQueuedSynchronizer {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Sync() {}
|
||||
private
|
||||
Sync() {
|
||||
}
|
||||
|
||||
private Sync(final int initialState) {
|
||||
private
|
||||
Sync(final int initialState) {
|
||||
setState(initialState);
|
||||
}
|
||||
|
||||
|
@ -37,14 +81,16 @@ public class CountingLatch {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected int tryAcquireShared(final int acquires) {
|
||||
protected
|
||||
int tryAcquireShared(final int acquires) {
|
||||
return getState() == 0 ? 1 : -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean tryReleaseShared(final int delta) {
|
||||
protected
|
||||
boolean tryReleaseShared(final int delta) {
|
||||
// Decrement count; signal when transition to zero
|
||||
for (;;) {
|
||||
for (; ; ) {
|
||||
final int c = getState();
|
||||
final int nextc = c + delta;
|
||||
if (nextc < 0) {
|
||||
|
@ -56,34 +102,4 @@ public class CountingLatch {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final Sync sync;
|
||||
|
||||
public CountingLatch() {
|
||||
this.sync = new Sync();
|
||||
}
|
||||
|
||||
public CountingLatch(final int initialCount) {
|
||||
this.sync = new Sync(initialCount);
|
||||
}
|
||||
|
||||
public void increment() {
|
||||
this.sync.releaseShared(1);
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return this.sync.getCount();
|
||||
}
|
||||
|
||||
public void decrement() {
|
||||
this.sync.releaseShared(-1);
|
||||
}
|
||||
|
||||
public void await() throws InterruptedException {
|
||||
this.sync.acquireSharedInterruptibly(1);
|
||||
}
|
||||
|
||||
public boolean await(final long timeout) throws InterruptedException {
|
||||
return this.sync.tryAcquireSharedNanos(1, TimeUnit.MILLISECONDS.toNanos(timeout));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,29 +18,28 @@ package dorkbox.util;
|
|||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
public class DelayTimer {
|
||||
public interface Callback {
|
||||
public void execute();
|
||||
}
|
||||
|
||||
public
|
||||
class DelayTimer {
|
||||
private final String name;
|
||||
private final boolean isDaemon;
|
||||
private final Callback listener;
|
||||
|
||||
private Timer timer;
|
||||
private long delay;
|
||||
|
||||
public DelayTimer(Callback listener) {
|
||||
public
|
||||
DelayTimer(Callback listener) {
|
||||
this(null, true, listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sometimes you want to make sure that this timer will complete, even if the calling thread has terminated.
|
||||
* @param name the name of the thread (if you want to specify one)
|
||||
*
|
||||
* @param name the name of the thread (if you want to specify one)
|
||||
* @param isDaemon true if you want this timer to be run on a daemon thread
|
||||
* @param listener the callback listener to execute
|
||||
*/
|
||||
public DelayTimer(String name, boolean isDaemon, Callback listener) {
|
||||
public
|
||||
DelayTimer(String name, boolean isDaemon, Callback listener) {
|
||||
this.name = name;
|
||||
this.listener = listener;
|
||||
this.isDaemon = isDaemon;
|
||||
|
@ -49,14 +48,16 @@ public class DelayTimer {
|
|||
/**
|
||||
* @return true if this timer is still waiting to run.
|
||||
*/
|
||||
public synchronized boolean isWaiting() {
|
||||
public synchronized
|
||||
boolean isWaiting() {
|
||||
return this.timer != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel the delay timer!
|
||||
*/
|
||||
public synchronized void cancel() {
|
||||
public synchronized
|
||||
void cancel() {
|
||||
if (this.timer != null) {
|
||||
this.timer.cancel();
|
||||
this.timer.purge();
|
||||
|
@ -67,32 +68,43 @@ public class DelayTimer {
|
|||
/**
|
||||
* @param delay milliseconds to wait
|
||||
*/
|
||||
public synchronized void delay(long delay) {
|
||||
public synchronized
|
||||
void delay(long delay) {
|
||||
this.delay = delay;
|
||||
cancel();
|
||||
|
||||
if (delay > 0) {
|
||||
if (this.name != null) {
|
||||
this.timer = new Timer(this.name, this.isDaemon);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
this.timer = new Timer(this.isDaemon);
|
||||
}
|
||||
|
||||
TimerTask t = new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
public
|
||||
void run() {
|
||||
DelayTimer.this.listener.execute();
|
||||
DelayTimer.this.cancel();
|
||||
}
|
||||
};
|
||||
this.timer.schedule(t, delay);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
this.listener.execute();
|
||||
this.timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized long getDelay() {
|
||||
public synchronized
|
||||
long getDelay() {
|
||||
return this.delay;
|
||||
}
|
||||
|
||||
public
|
||||
interface Callback {
|
||||
public
|
||||
void execute();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util;
|
||||
|
||||
import dorkbox.util.messagebus.IMessageBus;
|
||||
|
@ -19,11 +34,13 @@ class MBus {
|
|||
|
||||
IPublicationErrorHandler ExceptionCounter = new IPublicationErrorHandler() {
|
||||
@Override
|
||||
public void handleError(PublicationError error) {
|
||||
public
|
||||
void handleError(PublicationError error) {
|
||||
logger.error(error.toString());
|
||||
|
||||
if (error.getCause() != null) {
|
||||
error.getCause().printStackTrace();
|
||||
error.getCause()
|
||||
.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,11 +48,15 @@ class MBus {
|
|||
public
|
||||
void handleError(final String error, final Class<?> listenerClass) {
|
||||
// Printout the error itself
|
||||
logger.error(new StringBuilder().append(error).append(": ").append(listenerClass.getSimpleName()).toString());
|
||||
logger.error(new StringBuilder().append(error)
|
||||
.append(": ")
|
||||
.append(listenerClass.getSimpleName())
|
||||
.toString());
|
||||
}
|
||||
};
|
||||
|
||||
messageBus.getErrorHandler().addErrorHandler(ExceptionCounter);
|
||||
messageBus.getErrorHandler()
|
||||
.addErrorHandler(ExceptionCounter);
|
||||
messageBus.start();
|
||||
|
||||
bus = messageBus;
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2011 See AUTHORS file.
|
||||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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
|
||||
* 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,
|
||||
|
@ -14,64 +14,73 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// pruned/limited version from libGDX, modified by dorkbox, llc
|
||||
|
||||
package dorkbox.util;
|
||||
|
||||
|
||||
public class MathUtils {
|
||||
@SuppressWarnings("unused")
|
||||
public
|
||||
class MathUtils {
|
||||
|
||||
// ---
|
||||
// ---
|
||||
|
||||
private static ThreadLocal<MersenneTwisterFast> random = new ThreadLocal<MersenneTwisterFast>();
|
||||
private static final ThreadLocal<MersenneTwisterFast> random = new ThreadLocal<MersenneTwisterFast>();
|
||||
|
||||
/**
|
||||
* Creates the thread local MersenneTwister (as it's not thread safe), if necessary
|
||||
*/
|
||||
public static MersenneTwisterFast random() {
|
||||
public static
|
||||
MersenneTwisterFast random() {
|
||||
MersenneTwisterFast mersenneTwisterFast = random.get();
|
||||
|
||||
if (mersenneTwisterFast == null) {
|
||||
mersenneTwisterFast = new MersenneTwisterFast();
|
||||
random.set(mersenneTwisterFast);
|
||||
return mersenneTwisterFast;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
return mersenneTwisterFast;
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns a random integer */
|
||||
static public final int randomInt () {
|
||||
public static
|
||||
int randomInt() {
|
||||
return random().nextInt();
|
||||
}
|
||||
|
||||
/** Returns a random number between 0 (inclusive) and the specified value (inclusive). */
|
||||
static public final int randomInt (int range) {
|
||||
public static
|
||||
int randomInt(int range) {
|
||||
return random().nextInt(range + 1);
|
||||
}
|
||||
|
||||
/** Returns a random number between start (inclusive) and end (inclusive). */
|
||||
static public final int randomInt (int start, int end) {
|
||||
public static
|
||||
int randomInt(int start, int end) {
|
||||
return start + random().nextInt(end - start + 1);
|
||||
}
|
||||
|
||||
/** Returns a random boolean value. */
|
||||
static public final boolean randomBoolean () {
|
||||
public static
|
||||
boolean randomBoolean() {
|
||||
return random().nextBoolean();
|
||||
}
|
||||
|
||||
/** Returns random number between 0.0 (inclusive) and 1.0 (exclusive). */
|
||||
static public final float randomFloat () {
|
||||
public static
|
||||
float randomFloat() {
|
||||
return random().nextFloat();
|
||||
}
|
||||
|
||||
/** Returns a random number between 0 (inclusive) and the specified value (exclusive). */
|
||||
static public final float randomFloat (float range) {
|
||||
public static
|
||||
float randomFloat(float range) {
|
||||
return random().nextFloat() * range;
|
||||
}
|
||||
|
||||
/** Returns a random number between start (inclusive) and end (exclusive). */
|
||||
static public final float randomFloat (float start, float end) {
|
||||
public static
|
||||
float randomFloat(float start, float end) {
|
||||
return start + random().nextFloat() * (end - start);
|
||||
}
|
||||
|
||||
|
@ -79,26 +88,15 @@ public class MathUtils {
|
|||
|
||||
|
||||
/**
|
||||
* Returns the next power of two. Returns the specified value if the value
|
||||
* is already a power of two.
|
||||
* Returns the next power of two. Returns the specified value if the value is already a power of two.
|
||||
*/
|
||||
public static int nextPowerOfTwo(int value) {
|
||||
if (value == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
value--;
|
||||
|
||||
value |= value >> 1;
|
||||
value |= value >> 2;
|
||||
value |= value >> 4;
|
||||
value |= value >> 8;
|
||||
value |= value >> 16;
|
||||
|
||||
return value + 1;
|
||||
public static
|
||||
int nextPowerOfTwo(int value) {
|
||||
return 1 << (32 - Integer.numberOfLeadingZeros(value - 1));
|
||||
}
|
||||
|
||||
public static boolean isPowerOfTwo(int value) {
|
||||
public static
|
||||
boolean isPowerOfTwo(int value) {
|
||||
return value != 0 && (value & value - 1) == 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
|
|
@ -21,17 +21,18 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||
/**
|
||||
* The default thread factory with names.
|
||||
*/
|
||||
public class NamedThreadFactory implements ThreadFactory {
|
||||
public
|
||||
class NamedThreadFactory implements ThreadFactory {
|
||||
private static final AtomicInteger poolId = new AtomicInteger();
|
||||
|
||||
// permit this to be changed!
|
||||
/**
|
||||
* The 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
|
||||
*<p>
|
||||
* <p/>
|
||||
* 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!!!
|
||||
* <p>
|
||||
* <p/>
|
||||
* Stack size must be specified in bytes. Default is 8k
|
||||
*/
|
||||
public static int stackSizeForThreads = 8192;
|
||||
|
@ -39,56 +40,72 @@ public class NamedThreadFactory implements ThreadFactory {
|
|||
private final AtomicInteger nextId = new AtomicInteger();
|
||||
|
||||
private final ThreadGroup group;
|
||||
private final String namePrefix;
|
||||
private final int threadPriority;
|
||||
private final boolean daemon;
|
||||
private final String namePrefix;
|
||||
private final int threadPriority;
|
||||
private final boolean daemon;
|
||||
|
||||
/**
|
||||
* Creates a DAEMON thread
|
||||
*/
|
||||
public NamedThreadFactory(String poolNamePrefix) {
|
||||
this(poolNamePrefix, Thread.currentThread().getThreadGroup(), Thread.MAX_PRIORITY, true);
|
||||
public
|
||||
NamedThreadFactory(String poolNamePrefix) {
|
||||
this(poolNamePrefix,
|
||||
Thread.currentThread()
|
||||
.getThreadGroup(),
|
||||
Thread.MAX_PRIORITY,
|
||||
true);
|
||||
}
|
||||
|
||||
public NamedThreadFactory(String poolNamePrefix, boolean isDaemon) {
|
||||
this(poolNamePrefix, Thread.currentThread().getThreadGroup(), Thread.MAX_PRIORITY, isDaemon);
|
||||
public
|
||||
NamedThreadFactory(String poolNamePrefix, boolean isDaemon) {
|
||||
this(poolNamePrefix,
|
||||
Thread.currentThread()
|
||||
.getThreadGroup(),
|
||||
Thread.MAX_PRIORITY,
|
||||
isDaemon);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a DAEMON thread
|
||||
*/
|
||||
public NamedThreadFactory(String poolNamePrefix, ThreadGroup group) {
|
||||
public
|
||||
NamedThreadFactory(String poolNamePrefix, ThreadGroup group) {
|
||||
this(poolNamePrefix, group, Thread.MAX_PRIORITY, true);
|
||||
}
|
||||
|
||||
public NamedThreadFactory(String poolNamePrefix, ThreadGroup group, boolean isDaemon) {
|
||||
public
|
||||
NamedThreadFactory(String poolNamePrefix, ThreadGroup group, boolean isDaemon) {
|
||||
this(poolNamePrefix, group, Thread.MAX_PRIORITY, isDaemon);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a DAEMON thread
|
||||
*/
|
||||
public NamedThreadFactory(String poolNamePrefix, int threadPriority) {
|
||||
this(poolNamePrefix, threadPriority, true);
|
||||
public
|
||||
NamedThreadFactory(String poolNamePrefix, int threadPriority) {
|
||||
this(poolNamePrefix, threadPriority, true);
|
||||
}
|
||||
|
||||
public NamedThreadFactory(String poolNamePrefix, int threadPriority, boolean isDaemon) {
|
||||
public
|
||||
NamedThreadFactory(String poolNamePrefix, int threadPriority, boolean isDaemon) {
|
||||
this(poolNamePrefix, null, threadPriority, isDaemon);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param poolNamePrefix what you want the subsequent threads to be named.
|
||||
* @param group the group this thread will belong to. If NULL, it will belong to the current thread group.
|
||||
* @param group the group this thread will belong to. If NULL, it will belong to the current thread group.
|
||||
* @param threadPriority Thread.MIN_PRIORITY, Thread.NORM_PRIORITY, Thread.MAX_PRIORITY
|
||||
*/
|
||||
public NamedThreadFactory(String poolNamePrefix, ThreadGroup group, int threadPriority, boolean isDaemon) {
|
||||
public
|
||||
NamedThreadFactory(String poolNamePrefix, ThreadGroup group, int threadPriority, boolean isDaemon) {
|
||||
this.daemon = isDaemon;
|
||||
this.namePrefix = poolNamePrefix + '-' + poolId.incrementAndGet();
|
||||
if (group == null) {
|
||||
this.group = Thread.currentThread().getThreadGroup();
|
||||
} else {
|
||||
this.group = Thread.currentThread()
|
||||
.getThreadGroup();
|
||||
}
|
||||
else {
|
||||
this.group = group;
|
||||
}
|
||||
|
||||
|
@ -99,16 +116,17 @@ public class NamedThreadFactory implements ThreadFactory {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
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(this.group, r, this.namePrefix + '-' + this.nextId.incrementAndGet(), stackSizeForThreads);
|
||||
Thread t = new Thread(this.group, r, this.namePrefix + '-' + this.nextId.incrementAndGet(), stackSizeForThreads);
|
||||
t.setDaemon(this.daemon);
|
||||
if (t.getPriority() != this.threadPriority) {
|
||||
t.setPriority(this.threadPriority);
|
||||
}
|
||||
return t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
|
@ -7,13 +22,9 @@ import com.esotericsoftware.kryo.io.Input;
|
|||
import com.esotericsoftware.kryo.io.Output;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public
|
||||
interface SerializationManager {
|
||||
|
||||
|
||||
/**
|
||||
* Registers the class using the lowest, next available integer ID and the
|
||||
* {@link Kryo#getDefaultSerializer(Class) default serializer}. If the class
|
||||
|
|
|
@ -15,46 +15,48 @@
|
|||
*/
|
||||
package dorkbox.util;
|
||||
|
||||
import java.awt.Container;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.GraphicsDevice;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.MouseInfo;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
public class SwingUtil {
|
||||
public static void showOnSameScreenAsMouseCenter(Container frame) {
|
||||
Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
|
||||
public
|
||||
class SwingUtil {
|
||||
public static
|
||||
void showOnSameScreenAsMouseCenter(Container frame) {
|
||||
Point mouseLocation = MouseInfo.getPointerInfo()
|
||||
.getLocation();
|
||||
|
||||
GraphicsDevice deviceAtMouse = getGraphicsDeviceAt(mouseLocation);
|
||||
Rectangle bounds = deviceAtMouse.getDefaultConfiguration().getBounds();
|
||||
Rectangle bounds = deviceAtMouse.getDefaultConfiguration()
|
||||
.getBounds();
|
||||
frame.setLocation(bounds.x + bounds.width / 2 - frame.getWidth() / 2, bounds.height / 2 - frame.getHeight() / 2);
|
||||
}
|
||||
|
||||
public static void showOnSameScreenAsMouse(Container frame) {
|
||||
Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
|
||||
public static
|
||||
void showOnSameScreenAsMouse(Container frame) {
|
||||
Point mouseLocation = MouseInfo.getPointerInfo()
|
||||
.getLocation();
|
||||
|
||||
GraphicsDevice deviceAtMouse = getGraphicsDeviceAt(mouseLocation);
|
||||
frame.setLocation(deviceAtMouse.getDefaultConfiguration().getBounds().x, frame.getY());
|
||||
frame.setLocation(deviceAtMouse.getDefaultConfiguration()
|
||||
.getBounds().x, frame.getY());
|
||||
}
|
||||
|
||||
public static Rectangle getScreenBoundsAt(Point pos) {
|
||||
public static
|
||||
Rectangle getScreenBoundsAt(Point pos) {
|
||||
GraphicsDevice gd = SwingUtil.getGraphicsDeviceAt(pos);
|
||||
Rectangle bounds = null;
|
||||
if (gd != null) {
|
||||
bounds = gd.getDefaultConfiguration().getBounds();
|
||||
bounds = gd.getDefaultConfiguration()
|
||||
.getBounds();
|
||||
}
|
||||
|
||||
return bounds;
|
||||
}
|
||||
|
||||
public static GraphicsDevice getGraphicsDeviceAt(Point pos) {
|
||||
public static
|
||||
GraphicsDevice getGraphicsDeviceAt(Point pos) {
|
||||
GraphicsDevice device;
|
||||
|
||||
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
|
@ -74,7 +76,8 @@ public class SwingUtil {
|
|||
|
||||
if (lstDevices.size() > 0) {
|
||||
device = lstDevices.get(0);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
device = ge.getDefaultScreenDevice();
|
||||
}
|
||||
|
||||
|
@ -104,18 +107,22 @@ public class SwingUtil {
|
|||
// return insets;
|
||||
// }
|
||||
|
||||
public static void invokeLater(Runnable runnable) {
|
||||
public static
|
||||
void invokeLater(Runnable runnable) {
|
||||
if (EventQueue.isDispatchThread()) {
|
||||
runnable.run();
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
SwingUtilities.invokeLater(runnable);
|
||||
}
|
||||
}
|
||||
|
||||
public static void invokeAndWait(Runnable runnable) {
|
||||
public static
|
||||
void invokeAndWait(Runnable runnable) {
|
||||
if (EventQueue.isDispatchThread()) {
|
||||
runnable.run();
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
try {
|
||||
EventQueue.invokeAndWait(runnable);
|
||||
} catch (InvocationTargetException e) {
|
||||
|
|
|
@ -25,7 +25,8 @@ import java.util.Map.Entry;
|
|||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public
|
||||
@SuppressWarnings("unused")
|
||||
public final
|
||||
class Sys {
|
||||
public static final int javaVersion = getJavaVersion();
|
||||
public static final boolean isAndroid = getIsAndroid();
|
||||
|
@ -35,9 +36,9 @@ class Sys {
|
|||
public static final int GIGABYTE = 1024 * MEGABYTE;
|
||||
public static final long TERABYTE = 1024L * GIGABYTE;
|
||||
|
||||
public static char[] HEX_CHARS = new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||
public static final char[] HEX_CHARS = new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||
|
||||
public static final
|
||||
public static
|
||||
char[] convertStringToChars(String string) {
|
||||
char[] charArray = string.toCharArray();
|
||||
|
||||
|
@ -89,7 +90,7 @@ class Sys {
|
|||
|
||||
|
||||
|
||||
public static final
|
||||
public static
|
||||
void eraseString(String string) {
|
||||
// You can change the value of the inner char[] using reflection.
|
||||
//
|
||||
|
@ -271,7 +272,7 @@ class Sys {
|
|||
public static
|
||||
<T extends OutputStream> T copyStream(InputStream inputStream, T outputStream) throws IOException {
|
||||
byte[] buffer = new byte[4096];
|
||||
int read = 0;
|
||||
int read;
|
||||
while ((read = inputStream.read(buffer)) > 0) {
|
||||
outputStream.write(buffer, 0, read);
|
||||
}
|
||||
|
@ -287,7 +288,7 @@ class Sys {
|
|||
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
|
||||
|
||||
byte[] buffer = new byte[4096];
|
||||
int read = 0;
|
||||
int read;
|
||||
while ((read = inputStream.read(buffer)) > 0) {
|
||||
baos.write(buffer, 0, read);
|
||||
}
|
||||
|
@ -297,12 +298,12 @@ class Sys {
|
|||
return baos.toByteArray();
|
||||
}
|
||||
|
||||
public static final
|
||||
public static
|
||||
byte[] copyBytes(byte[] src) {
|
||||
return copyBytes(src, 0);
|
||||
}
|
||||
|
||||
public static final
|
||||
public static
|
||||
byte[] copyBytes(byte[] src, int position) {
|
||||
int length = src.length - position;
|
||||
|
||||
|
@ -311,7 +312,7 @@ class Sys {
|
|||
return b;
|
||||
}
|
||||
|
||||
public static final
|
||||
public static
|
||||
byte[] concatBytes(byte[]... arrayBytes) {
|
||||
int length = 0;
|
||||
for (byte[] bytes : arrayBytes) {
|
||||
|
@ -332,7 +333,7 @@ class Sys {
|
|||
/**
|
||||
* gets the SHA256 hash + SALT of the specified username, as UTF-16
|
||||
*/
|
||||
public static final
|
||||
public static
|
||||
byte[] getSha256WithSalt(String username, byte[] saltBytes) {
|
||||
if (username == null) {
|
||||
return null;
|
||||
|
@ -353,7 +354,7 @@ class Sys {
|
|||
/**
|
||||
* gets the SHA256 hash of the specified string, as UTF-16
|
||||
*/
|
||||
public static final
|
||||
public static
|
||||
byte[] getSha256(String string) {
|
||||
byte[] charToBytes = Sys.charToBytes(string.toCharArray());
|
||||
|
||||
|
@ -368,7 +369,7 @@ class Sys {
|
|||
/**
|
||||
* gets the SHA256 hash of the specified byte array
|
||||
*/
|
||||
public static final
|
||||
public static
|
||||
byte[] getSha256(byte[] bytes) {
|
||||
|
||||
SHA256Digest sha256 = new SHA256Digest();
|
||||
|
@ -382,7 +383,7 @@ class Sys {
|
|||
/**
|
||||
* this saves the char array in UTF-16 format of bytes
|
||||
*/
|
||||
public static final
|
||||
public static
|
||||
byte[] charToBytes(char[] text) {
|
||||
// NOTE: this saves the char array in UTF-16 format of bytes.
|
||||
byte[] bytes = new byte[text.length * 2];
|
||||
|
@ -395,7 +396,7 @@ class Sys {
|
|||
}
|
||||
|
||||
|
||||
public static final
|
||||
public static
|
||||
byte[] intsToBytes(int[] ints) {
|
||||
int length = ints.length;
|
||||
byte[] bytes = new byte[length];
|
||||
|
@ -413,7 +414,7 @@ class Sys {
|
|||
return bytes;
|
||||
}
|
||||
|
||||
public static final
|
||||
public static
|
||||
int[] bytesToInts(byte[] bytes) {
|
||||
int length = bytes.length;
|
||||
int[] ints = new int[length];
|
||||
|
@ -425,12 +426,12 @@ class Sys {
|
|||
return ints;
|
||||
}
|
||||
|
||||
public static final
|
||||
public static
|
||||
String bytesToHex(byte[] bytes) {
|
||||
return bytesToHex(bytes, false);
|
||||
}
|
||||
|
||||
public static final
|
||||
public static
|
||||
String bytesToHex(byte[] bytes, boolean padding) {
|
||||
if (padding) {
|
||||
char[] hexString = new char[3 * bytes.length];
|
||||
|
@ -461,7 +462,7 @@ class Sys {
|
|||
* Converts an ASCII character representing a hexadecimal
|
||||
* value into its integer equivalent.
|
||||
*/
|
||||
public static final
|
||||
public static
|
||||
int hexByteToInt(byte b) {
|
||||
switch (b) {
|
||||
case '0':
|
||||
|
@ -510,7 +511,7 @@ class Sys {
|
|||
/**
|
||||
* A 4-digit hex result.
|
||||
*/
|
||||
public static final
|
||||
public static
|
||||
void hex4(char c, StringBuilder sb) {
|
||||
sb.append(HEX_CHARS[(c & 0xF000) >> 12]);
|
||||
sb.append(HEX_CHARS[(c & 0x0F00) >> 8]);
|
||||
|
@ -526,7 +527,7 @@ class Sys {
|
|||
* @return a string representation of the byte array as a series of
|
||||
* hexadecimal characters
|
||||
*/
|
||||
public static final
|
||||
public static
|
||||
String toHexString(byte[] bytes) {
|
||||
char[] hexString = new char[2 * bytes.length];
|
||||
int j = 0;
|
||||
|
@ -558,14 +559,12 @@ class Sys {
|
|||
|
||||
|
||||
|
||||
public static final
|
||||
public static
|
||||
byte[] encodeStringArray(List<String> array) {
|
||||
int length = 0;
|
||||
for (String s : array) {
|
||||
byte[] bytes = s.getBytes();
|
||||
if (bytes != null) {
|
||||
length += bytes.length;
|
||||
}
|
||||
length += bytes.length;
|
||||
}
|
||||
|
||||
if (length == 0) {
|
||||
|
@ -585,7 +584,7 @@ class Sys {
|
|||
return bytes;
|
||||
}
|
||||
|
||||
public static final
|
||||
public static
|
||||
ArrayList<String> decodeStringArray(byte[] bytes) {
|
||||
int length = bytes.length;
|
||||
int position = 0;
|
||||
|
@ -609,24 +608,23 @@ class Sys {
|
|||
}
|
||||
|
||||
public static
|
||||
String printArrayRaw(byte[] bytes) {
|
||||
String printArrayRaw(final byte[] bytes) {
|
||||
return printArrayRaw(bytes, 0);
|
||||
}
|
||||
|
||||
public static
|
||||
String printArrayRaw(byte[] bytes, int lineLength) {
|
||||
String printArrayRaw(final byte[] bytes, final int lineLength) {
|
||||
if (lineLength > 0) {
|
||||
int mod = lineLength;
|
||||
int length = bytes.length;
|
||||
int comma = length - 1;
|
||||
|
||||
StringBuilder builder = new StringBuilder(length + length / mod);
|
||||
StringBuilder builder = new StringBuilder(length + length / lineLength);
|
||||
for (int i = 0; i < length; i++) {
|
||||
builder.append(bytes[i]);
|
||||
if (i < comma) {
|
||||
builder.append(",");
|
||||
}
|
||||
if (i > 0 && i % mod == 0) {
|
||||
if (i > 0 && i % lineLength == 0) {
|
||||
builder.append(OS.LINE_SEPARATOR);
|
||||
}
|
||||
}
|
||||
|
@ -777,9 +775,17 @@ class Sys {
|
|||
// dig +short myip.opendns.com @resolver1.opendns.com
|
||||
|
||||
// method 2: use public http servers
|
||||
final String websites[] = {"http://ip.dorkbox.com/", "http://ip.javalauncher.com/", "http://checkip.dyndns.com/",
|
||||
"http://checkip.dyn.com/", "http://curlmyip.com/", "http://tnx.nl/ip", "http://ipecho.net/plain",
|
||||
"http://icanhazip.com/", "http://ip.appspot.com/",};
|
||||
// @formatter:off
|
||||
final String websites[] = {"http://ip.dorkbox.com/",
|
||||
"http://ip.javalauncher.com/",
|
||||
"http://checkip.dyndns.com/",
|
||||
"http://checkip.dyn.com/",
|
||||
"http://curlmyip.com/",
|
||||
"http://tnx.nl/ip",
|
||||
"http://ipecho.net/plain",
|
||||
"http://icanhazip.com/",
|
||||
"http://ip.appspot.com/",};
|
||||
// @formatter:on
|
||||
|
||||
// loop, since they won't always work.
|
||||
for (int i = 0; i < websites.length; i++) {
|
||||
|
@ -793,11 +799,10 @@ class Sys {
|
|||
Pattern pattern = Pattern.compile("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b");
|
||||
Matcher matcher = pattern.matcher(response);
|
||||
if (matcher.find()) {
|
||||
String IP = matcher.group()
|
||||
return matcher.group()
|
||||
.trim();
|
||||
return IP;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -890,9 +895,13 @@ class Sys {
|
|||
}
|
||||
}
|
||||
}
|
||||
} catch (SocketException e) {
|
||||
} catch (SocketException ignored) {
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private
|
||||
Sys() {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,29 +24,31 @@ import java.nio.ByteBuffer;
|
|||
/**
|
||||
* This is (mostly) motorola, and is "network byte order".
|
||||
* This is also the default for Java.
|
||||
* <p>
|
||||
* <p/>
|
||||
* arm is technically bi-endian
|
||||
*/
|
||||
@SuppressWarnings("ALL")
|
||||
public class BigEndian {
|
||||
public
|
||||
class BigEndian {
|
||||
// the following are ALL in Bit-Endian (byte[0] is most significant)
|
||||
// TODO: switch these to big endian. these are a copy of little endian
|
||||
|
||||
/** CHAR to and from bytes */
|
||||
|
||||
/**
|
||||
* CHAR to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class Char_ {
|
||||
private
|
||||
Char_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
char from(byte[] bytes, int offset, int bytenum) {
|
||||
char number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 2: number |= (bytes[offset+0] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+1] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -58,8 +60,10 @@ public class BigEndian {
|
|||
char number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 2: number |= (bytes[0] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[1] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[0] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[1] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -67,15 +71,12 @@ public class BigEndian {
|
|||
|
||||
public static
|
||||
char from(byte b0, byte b1) {
|
||||
return (char) ((b0 & 0xFF) << 8 |
|
||||
(b1 & 0xFF) << 0);
|
||||
return (char) ((b0 & 0xFF) << 8 | (b1 & 0xFF) << 0);
|
||||
}
|
||||
|
||||
public static
|
||||
byte[] toBytes(char x) {
|
||||
return new byte[] {(byte) (x >> 8),
|
||||
(byte) (x >> 0)
|
||||
};
|
||||
return new byte[] {(byte) (x >> 8), (byte) (x >> 0)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -92,23 +93,28 @@ public class BigEndian {
|
|||
|
||||
return from(b[0], b[1]);
|
||||
}
|
||||
|
||||
private
|
||||
Char_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** UNSIGNED CHAR to and from bytes */
|
||||
|
||||
/**
|
||||
* UNSIGNED CHAR to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class UChar_ {
|
||||
private
|
||||
UChar_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
UShort from(byte[] bytes, int offset, int bytenum) {
|
||||
char number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 2: number |= (bytes[offset+0] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+1] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UShort.valueOf(number);
|
||||
|
@ -120,8 +126,10 @@ public class BigEndian {
|
|||
short number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 2: number |= (bytes[0] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[1] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[0] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[1] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UShort.valueOf(number);
|
||||
|
@ -129,19 +137,14 @@ public class BigEndian {
|
|||
|
||||
public static
|
||||
UShort from(byte b0, byte b1) {
|
||||
return UShort.valueOf((short)
|
||||
((b0 & 0xFF) << 8) |
|
||||
(b1 & 0xFF) << 0) ;
|
||||
return UShort.valueOf((short) ((b0 & 0xFF) << 8) | (b1 & 0xFF) << 0);
|
||||
}
|
||||
|
||||
|
||||
public static
|
||||
byte[] toBytes(UShort x) {
|
||||
int num = x.intValue();
|
||||
|
||||
return new byte[] {(byte) ((num & 0xFF00) >> 8),
|
||||
(byte) (num & 0x00FF >> 0),
|
||||
};
|
||||
return new byte[] {(byte) ((num & 0xFF00) >> 8), (byte) (num & 0x00FF >> 0),};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -158,23 +161,28 @@ public class BigEndian {
|
|||
|
||||
return from(b[0], b[1]);
|
||||
}
|
||||
|
||||
private
|
||||
UChar_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** SHORT to and from bytes */
|
||||
|
||||
/**
|
||||
* SHORT to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class Short_ {
|
||||
private
|
||||
Short_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
short from(byte[] bytes, int offset, int bytenum) {
|
||||
short number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 2: number |= (bytes[offset+0] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+1] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -186,8 +194,10 @@ public class BigEndian {
|
|||
short number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 2: number |= (bytes[0] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[1] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[0] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[1] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -195,16 +205,12 @@ public class BigEndian {
|
|||
|
||||
public static
|
||||
short from(byte b0, byte b1) {
|
||||
return (short) ((b0 & 0xFF) << 8 |
|
||||
(b1 & 0xFF) << 0);
|
||||
return (short) ((b0 & 0xFF) << 8 | (b1 & 0xFF) << 0);
|
||||
}
|
||||
|
||||
|
||||
public static
|
||||
byte[] toBytes(short x) {
|
||||
return new byte[] {(byte) (x >> 8),
|
||||
(byte) (x >> 0)
|
||||
};
|
||||
return new byte[] {(byte) (x >> 8), (byte) (x >> 0)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -221,23 +227,28 @@ public class BigEndian {
|
|||
|
||||
return from(b[0], b[1]);
|
||||
}
|
||||
|
||||
private
|
||||
Short_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** UNSIGNED SHORT to and from bytes */
|
||||
|
||||
/**
|
||||
* UNSIGNED SHORT to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class UShort_ {
|
||||
private
|
||||
UShort_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
UShort from(byte[] bytes, int offset, int bytenum) {
|
||||
char number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 2: number |= (bytes[offset+0] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+1] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UShort.valueOf(number);
|
||||
|
@ -249,8 +260,10 @@ public class BigEndian {
|
|||
short number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 2: number |= (bytes[0] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[1] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[0] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[1] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UShort.valueOf(number);
|
||||
|
@ -258,19 +271,14 @@ public class BigEndian {
|
|||
|
||||
public static
|
||||
UShort from(byte b0, byte b1) {
|
||||
return UShort.valueOf((short)
|
||||
((b0 & 0xFF) << 8) |
|
||||
(b1 & 0xFF) << 0) ;
|
||||
return UShort.valueOf((short) ((b0 & 0xFF) << 8) | (b1 & 0xFF) << 0);
|
||||
}
|
||||
|
||||
|
||||
public static
|
||||
byte[] toBytes(UShort x) {
|
||||
int num = x.intValue();
|
||||
|
||||
return new byte[] {(byte) ((num & 0xFF00) >> 8),
|
||||
(byte) (num & 0x00FF >> 0),
|
||||
};
|
||||
return new byte[] {(byte) ((num & 0xFF00) >> 8), (byte) (num & 0x00FF >> 0),};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -287,25 +295,32 @@ public class BigEndian {
|
|||
|
||||
return from(b[0], b[1]);
|
||||
}
|
||||
|
||||
private
|
||||
UShort_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** INT to and from bytes */
|
||||
|
||||
/**
|
||||
* INT to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class Int_ {
|
||||
private
|
||||
Int_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
int from(byte[] bytes, int offset, int bytenum) {
|
||||
int number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 4: number |= (bytes[offset+0] & 0xFF) << 24;
|
||||
case 3: number |= (bytes[offset+1] & 0xFF) << 16;
|
||||
case 2: number |= (bytes[offset+2] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+3] & 0xFF) << 0;
|
||||
case 4:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (bytes[offset + 2] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 3] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -317,10 +332,14 @@ public class BigEndian {
|
|||
int number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 4: number |= (bytes[0] & 0xFF) << 24;
|
||||
case 3: number |= (bytes[1] & 0xFF) << 16;
|
||||
case 2: number |= (bytes[2] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[3] & 0xFF) << 0;
|
||||
case 4:
|
||||
number |= (bytes[0] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (bytes[1] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (bytes[2] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[3] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -330,17 +349,13 @@ public class BigEndian {
|
|||
int from(byte b0, byte b1, byte b2, byte b3) {
|
||||
return (b0 & 0xFF) << 24 |
|
||||
(b1 & 0xFF) << 16 |
|
||||
(b2 & 0xFF) << 8 |
|
||||
(b3 & 0xFF) << 0;
|
||||
(b2 & 0xFF) << 8 |
|
||||
(b3 & 0xFF) << 0;
|
||||
}
|
||||
|
||||
public static
|
||||
byte[] toBytes(int x) {
|
||||
return new byte[] {(byte) (x >> 24),
|
||||
(byte) (x >> 16),
|
||||
(byte) (x >> 8),
|
||||
(byte) (x >> 0)
|
||||
} ;
|
||||
return new byte[] {(byte) (x >> 24), (byte) (x >> 16), (byte) (x >> 8), (byte) (x >> 0)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -357,25 +372,32 @@ public class BigEndian {
|
|||
|
||||
return from(b[0], b[1], b[2], b[3]);
|
||||
}
|
||||
|
||||
private
|
||||
Int_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** UNSIGNED INT to and from bytes */
|
||||
|
||||
/**
|
||||
* UNSIGNED INT to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class UInt_ {
|
||||
private
|
||||
UInt_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
UInteger from(byte[] bytes, int offset, int bytenum) {
|
||||
int number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 4: number |= (bytes[offset+0] & 0xFF) << 24;
|
||||
case 3: number |= (bytes[offset+1] & 0xFF) << 16;
|
||||
case 2: number |= (bytes[offset+2] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+3] & 0xFF) << 0;
|
||||
case 4:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (bytes[offset + 2] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 3] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UInteger.valueOf(number);
|
||||
|
@ -387,10 +409,14 @@ public class BigEndian {
|
|||
int number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 4: number |= (bytes[0] & 0xFF) << 24;
|
||||
case 3: number |= (bytes[1] & 0xFF) << 16;
|
||||
case 2: number |= (bytes[2] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[3] & 0xFF) << 0;
|
||||
case 4:
|
||||
number |= (bytes[0] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (bytes[1] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (bytes[2] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[3] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UInteger.valueOf(number);
|
||||
|
@ -400,8 +426,8 @@ public class BigEndian {
|
|||
UInteger from(byte b0, byte b1, byte b2, byte b3) {
|
||||
int number = (b0 & 0xFF) << 24 |
|
||||
(b1 & 0xFF) << 16 |
|
||||
(b2 & 0xFF) << 8 |
|
||||
(b3 & 0xFF) << 0;
|
||||
(b2 & 0xFF) << 8 |
|
||||
(b3 & 0xFF) << 0;
|
||||
|
||||
return UInteger.valueOf(number);
|
||||
}
|
||||
|
@ -410,11 +436,8 @@ public class BigEndian {
|
|||
byte[] toBytes(UInteger x) {
|
||||
long num = x.longValue();
|
||||
|
||||
return new byte[] {(byte) ((num & 0xFF000000L) >> 24),
|
||||
(byte) ((num & 0x00FF0000L) >> 16),
|
||||
(byte) ((num & 0x0000FF00L) >> 8),
|
||||
(byte) (num & 0x000000FFL >> 0)
|
||||
};
|
||||
return new byte[] {(byte) ((num & 0xFF000000L) >> 24), (byte) ((num & 0x00FF0000L) >> 16), (byte) ((num & 0x0000FF00L) >> 8),
|
||||
(byte) (num & 0x000000FFL >> 0)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -431,29 +454,40 @@ public class BigEndian {
|
|||
|
||||
return from(b[0], b[1], b[2], b[3]);
|
||||
}
|
||||
|
||||
private
|
||||
UInt_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** LONG to and from bytes */
|
||||
|
||||
/**
|
||||
* LONG to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class Long_ {
|
||||
private
|
||||
Long_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
long from(byte[] bytes, int offset, int bytenum) {
|
||||
long number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 8: number |= (long) (bytes[offset+0] & 0xFF) << 56;
|
||||
case 7: number |= (long) (bytes[offset+1] & 0xFF) << 48;
|
||||
case 6: number |= (long) (bytes[offset+2] & 0xFF) << 40;
|
||||
case 5: number |= (long) (bytes[offset+3] & 0xFF) << 32;
|
||||
case 4: number |= (long) (bytes[offset+4] & 0xFF) << 24;
|
||||
case 3: number |= (long) (bytes[offset+5] & 0xFF) << 16;
|
||||
case 2: number |= (long) (bytes[offset+6] & 0xFF) << 8;
|
||||
case 1: number |= (long) (bytes[offset+7] & 0xFF) << 0;
|
||||
case 8:
|
||||
number |= (long) (bytes[offset + 0] & 0xFF) << 56;
|
||||
case 7:
|
||||
number |= (long) (bytes[offset + 1] & 0xFF) << 48;
|
||||
case 6:
|
||||
number |= (long) (bytes[offset + 2] & 0xFF) << 40;
|
||||
case 5:
|
||||
number |= (long) (bytes[offset + 3] & 0xFF) << 32;
|
||||
case 4:
|
||||
number |= (long) (bytes[offset + 4] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (long) (bytes[offset + 5] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (long) (bytes[offset + 6] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (long) (bytes[offset + 7] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -465,14 +499,22 @@ public class BigEndian {
|
|||
long number = 0L;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 8: number |= (long) (bytes[0] & 0xFF) << 56;
|
||||
case 7: number |= (long) (bytes[1] & 0xFF) << 48;
|
||||
case 6: number |= (long) (bytes[2] & 0xFF) << 40;
|
||||
case 5: number |= (long) (bytes[3] & 0xFF) << 32;
|
||||
case 4: number |= (long) (bytes[4] & 0xFF) << 24;
|
||||
case 3: number |= (long) (bytes[5] & 0xFF) << 16;
|
||||
case 2: number |= (long) (bytes[6] & 0xFF) << 8;
|
||||
case 1: number |= (long) (bytes[7] & 0xFF) << 0;
|
||||
case 8:
|
||||
number |= (long) (bytes[0] & 0xFF) << 56;
|
||||
case 7:
|
||||
number |= (long) (bytes[1] & 0xFF) << 48;
|
||||
case 6:
|
||||
number |= (long) (bytes[2] & 0xFF) << 40;
|
||||
case 5:
|
||||
number |= (long) (bytes[3] & 0xFF) << 32;
|
||||
case 4:
|
||||
number |= (long) (bytes[4] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (long) (bytes[5] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (long) (bytes[6] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (long) (bytes[7] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -486,21 +528,14 @@ public class BigEndian {
|
|||
(long) (b3 & 0xFF) << 32 |
|
||||
(long) (b4 & 0xFF) << 24 |
|
||||
(long) (b5 & 0xFF) << 16 |
|
||||
(long) (b6 & 0xFF) << 8 |
|
||||
(long) (b7 & 0xFF) << 0;
|
||||
(long) (b6 & 0xFF) << 8 |
|
||||
(long) (b7 & 0xFF) << 0;
|
||||
}
|
||||
|
||||
public static
|
||||
byte[] toBytes (long x) {
|
||||
return new byte[] {(byte) (x >> 56),
|
||||
(byte) (x >> 48),
|
||||
(byte) (x >> 40),
|
||||
(byte) (x >> 32),
|
||||
(byte) (x >> 24),
|
||||
(byte) (x >> 16),
|
||||
(byte) (x >> 8),
|
||||
(byte) (x >> 0)
|
||||
};
|
||||
byte[] toBytes(long x) {
|
||||
return new byte[] {(byte) (x >> 56), (byte) (x >> 48), (byte) (x >> 40), (byte) (x >> 32), (byte) (x >> 24), (byte) (x >> 16),
|
||||
(byte) (x >> 8), (byte) (x >> 0)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -517,35 +552,47 @@ public class BigEndian {
|
|||
|
||||
return from(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
|
||||
}
|
||||
|
||||
private
|
||||
Long_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** UNSIGNED LONG to and from bytes */
|
||||
|
||||
/**
|
||||
* UNSIGNED LONG to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class ULong_ {
|
||||
private
|
||||
ULong_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
ULong from(byte[] bytes, int offset, int bytenum) {
|
||||
long number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 8: number |= (long) (bytes[offset+0] & 0xFF) << 56;
|
||||
case 7: number |= (long) (bytes[offset+1] & 0xFF) << 48;
|
||||
case 6: number |= (long) (bytes[offset+2] & 0xFF) << 40;
|
||||
case 5: number |= (long) (bytes[offset+3] & 0xFF) << 32;
|
||||
case 4: number |= (long) (bytes[offset+4] & 0xFF) << 24;
|
||||
case 3: number |= (long) (bytes[offset+5] & 0xFF) << 16;
|
||||
case 2: number |= (long) (bytes[offset+6] & 0xFF) << 8;
|
||||
case 1: number |= (long) (bytes[offset+7] & 0xFF) << 0;
|
||||
case 8:
|
||||
number |= (long) (bytes[offset + 0] & 0xFF) << 56;
|
||||
case 7:
|
||||
number |= (long) (bytes[offset + 1] & 0xFF) << 48;
|
||||
case 6:
|
||||
number |= (long) (bytes[offset + 2] & 0xFF) << 40;
|
||||
case 5:
|
||||
number |= (long) (bytes[offset + 3] & 0xFF) << 32;
|
||||
case 4:
|
||||
number |= (long) (bytes[offset + 4] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (long) (bytes[offset + 5] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (long) (bytes[offset + 6] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (long) (bytes[offset + 7] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return ULong.valueOf(number);
|
||||
}
|
||||
|
||||
public static ULong from(byte[] bytes) {
|
||||
public static
|
||||
ULong from(byte[] bytes) {
|
||||
BigInteger ulong = new BigInteger(1, bytes);
|
||||
return ULong.valueOf(ulong);
|
||||
}
|
||||
|
@ -558,9 +605,10 @@ public class BigEndian {
|
|||
}
|
||||
|
||||
public static
|
||||
byte[] toBytes (ULong x) {
|
||||
byte[] toBytes(ULong x) {
|
||||
// returns the shortest length byte array possible
|
||||
byte[] bytes = x.toBigInteger().toByteArray();
|
||||
byte[] bytes = x.toBigInteger()
|
||||
.toByteArray();
|
||||
|
||||
|
||||
if (bytes.length < 8) {
|
||||
|
@ -595,6 +643,10 @@ public class BigEndian {
|
|||
|
||||
return from(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
|
||||
}
|
||||
|
||||
private
|
||||
ULong_() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,9 +17,11 @@ package dorkbox.util.bytes;
|
|||
|
||||
import dorkbox.util.objectPool.PoolableObject;
|
||||
|
||||
public class ByteBuffer2Poolable implements PoolableObject<ByteBuffer2> {
|
||||
public
|
||||
class ByteBuffer2Poolable implements PoolableObject<ByteBuffer2> {
|
||||
@Override
|
||||
public ByteBuffer2 create() {
|
||||
public
|
||||
ByteBuffer2 create() {
|
||||
return new ByteBuffer2(8, -1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,30 +23,32 @@ import java.nio.ByteBuffer;
|
|||
|
||||
/**
|
||||
* This is intel/amd/arm arch!
|
||||
* <p>
|
||||
* <p/>
|
||||
* arm is technically bi-endian
|
||||
* <p>
|
||||
* <p/>
|
||||
* Network byte order IS big endian, as is Java.
|
||||
*/
|
||||
@SuppressWarnings("ALL")
|
||||
public class LittleEndian {
|
||||
public
|
||||
class LittleEndian {
|
||||
// the following are ALL in Little-Endian (byte[0] is least significant)
|
||||
|
||||
/** CHAR to and from bytes */
|
||||
|
||||
/**
|
||||
* CHAR to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class Char_ {
|
||||
private
|
||||
Char_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
char from(byte[] bytes, int offset, int byteNum) {
|
||||
char number = 0;
|
||||
|
||||
switch (byteNum) {
|
||||
case 2: number |= (bytes[offset+1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+0] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -58,8 +60,10 @@ public class LittleEndian {
|
|||
char number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 2: number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[0] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -67,15 +71,12 @@ public class LittleEndian {
|
|||
|
||||
public static
|
||||
char from(byte b0, byte b1) {
|
||||
return (char) ((b1 & 0xFF) << 8 |
|
||||
(b0 & 0xFF) << 0);
|
||||
return (char) ((b1 & 0xFF) << 8 | (b0 & 0xFF) << 0);
|
||||
}
|
||||
|
||||
public static
|
||||
byte[] toBytes(char x) {
|
||||
return new byte[] {(byte) (x >> 0),
|
||||
(byte) (x >> 8)
|
||||
};
|
||||
return new byte[] {(byte) (x >> 0), (byte) (x >> 8)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -92,23 +93,28 @@ public class LittleEndian {
|
|||
|
||||
return from(b[0], b[1]);
|
||||
}
|
||||
|
||||
private
|
||||
Char_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** UNSIGNED CHAR to and from bytes */
|
||||
|
||||
/**
|
||||
* UNSIGNED CHAR to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class UChar_ {
|
||||
private
|
||||
UChar_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
UShort from(byte[] bytes, int offset, int bytenum) {
|
||||
char number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 2: number |= (bytes[offset+1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+0] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UShort.valueOf(number);
|
||||
|
@ -120,8 +126,10 @@ public class LittleEndian {
|
|||
short number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 2: number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[0] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UShort.valueOf(number);
|
||||
|
@ -129,19 +137,14 @@ public class LittleEndian {
|
|||
|
||||
public static
|
||||
UShort from(byte b0, byte b1) {
|
||||
return UShort.valueOf((short)
|
||||
((b1 & 0xFF) << 8) |
|
||||
(b0 & 0xFF) << 0) ;
|
||||
return UShort.valueOf((short) ((b1 & 0xFF) << 8) | (b0 & 0xFF) << 0);
|
||||
}
|
||||
|
||||
|
||||
public static
|
||||
byte[] toBytes(UShort x) {
|
||||
int num = x.intValue();
|
||||
|
||||
return new byte[] {(byte) (num & 0x00FF >> 0),
|
||||
(byte) ((num & 0xFF00) >> 8)
|
||||
};
|
||||
return new byte[] {(byte) (num & 0x00FF >> 0), (byte) ((num & 0xFF00) >> 8)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -158,23 +161,28 @@ public class LittleEndian {
|
|||
|
||||
return from(b[0], b[1]);
|
||||
}
|
||||
|
||||
private
|
||||
UChar_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** SHORT to and from bytes */
|
||||
|
||||
/**
|
||||
* SHORT to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class Short_ {
|
||||
private
|
||||
Short_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
short from(byte[] bytes, int offset, int bytenum) {
|
||||
short number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 2: number |= (bytes[offset+1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+0] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -186,8 +194,10 @@ public class LittleEndian {
|
|||
short number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 2: number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[0] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -195,16 +205,12 @@ public class LittleEndian {
|
|||
|
||||
public static
|
||||
short from(byte b0, byte b1) {
|
||||
return (short) ((b1 & 0xFF) << 8 |
|
||||
(b0 & 0xFF) << 0);
|
||||
return (short) ((b1 & 0xFF) << 8 | (b0 & 0xFF) << 0);
|
||||
}
|
||||
|
||||
|
||||
public static
|
||||
byte[] toBytes(short x) {
|
||||
return new byte[] {(byte) (x >> 0),
|
||||
(byte) (x >> 8)
|
||||
};
|
||||
return new byte[] {(byte) (x >> 0), (byte) (x >> 8)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -221,23 +227,28 @@ public class LittleEndian {
|
|||
|
||||
return from(b[0], b[1]);
|
||||
}
|
||||
|
||||
private
|
||||
Short_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** UNSIGNED SHORT to and from bytes */
|
||||
|
||||
/**
|
||||
* UNSIGNED SHORT to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class UShort_ {
|
||||
private
|
||||
UShort_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
UShort from(byte[] bytes, int offset, int bytenum) {
|
||||
short number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 2: number |= (bytes[offset+1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+0] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UShort.valueOf(number);
|
||||
|
@ -249,8 +260,10 @@ public class LittleEndian {
|
|||
short number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 2: number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[0] & 0xFF) << 0;
|
||||
case 2:
|
||||
number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UShort.valueOf(number);
|
||||
|
@ -258,19 +271,14 @@ public class LittleEndian {
|
|||
|
||||
public static
|
||||
UShort from(byte b0, byte b1) {
|
||||
return UShort.valueOf((short)
|
||||
((b1 & 0xFF) << 8 |
|
||||
(b0 & 0xFF) << 0));
|
||||
return UShort.valueOf((short) ((b1 & 0xFF) << 8 | (b0 & 0xFF) << 0));
|
||||
}
|
||||
|
||||
|
||||
public static
|
||||
byte[] toBytes(UShort x) {
|
||||
int num = x.intValue();
|
||||
|
||||
return new byte[] {(byte) (num & 0x00FF >> 0),
|
||||
(byte) ((num & 0xFF00) >> 8)
|
||||
};
|
||||
return new byte[] {(byte) (num & 0x00FF >> 0), (byte) ((num & 0xFF00) >> 8)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -287,25 +295,32 @@ public class LittleEndian {
|
|||
|
||||
return from(b[0], b[1]);
|
||||
}
|
||||
|
||||
private
|
||||
UShort_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** INT to and from bytes */
|
||||
|
||||
/**
|
||||
* INT to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class Int_ {
|
||||
private
|
||||
Int_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
int from(byte[] bytes, int offset, int bytenum) {
|
||||
int number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 4: number |= (bytes[offset+3] & 0xFF) << 24;
|
||||
case 3: number |= (bytes[offset+2] & 0xFF) << 16;
|
||||
case 2: number |= (bytes[offset+1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+0] & 0xFF) << 0;
|
||||
case 4:
|
||||
number |= (bytes[offset + 3] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (bytes[offset + 2] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -317,10 +332,14 @@ public class LittleEndian {
|
|||
int number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 4: number |= (bytes[3] & 0xFF) << 24;
|
||||
case 3: number |= (bytes[2] & 0xFF) << 16;
|
||||
case 2: number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[0] & 0xFF) << 0;
|
||||
case 4:
|
||||
number |= (bytes[3] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (bytes[2] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -330,17 +349,13 @@ public class LittleEndian {
|
|||
int from(byte b0, byte b1, byte b2, byte b3) {
|
||||
return (b3 & 0xFF) << 24 |
|
||||
(b2 & 0xFF) << 16 |
|
||||
(b1 & 0xFF) << 8 |
|
||||
(b0 & 0xFF) << 0;
|
||||
(b1 & 0xFF) << 8 |
|
||||
(b0 & 0xFF) << 0;
|
||||
}
|
||||
|
||||
public static
|
||||
byte[] toBytes(int x) {
|
||||
return new byte[] {(byte) (x >> 0),
|
||||
(byte) (x >> 8),
|
||||
(byte) (x >> 16),
|
||||
(byte) (x >> 24)
|
||||
} ;
|
||||
return new byte[] {(byte) (x >> 0), (byte) (x >> 8), (byte) (x >> 16), (byte) (x >> 24)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -357,25 +372,32 @@ public class LittleEndian {
|
|||
|
||||
return from(b[0], b[1], b[2], b[3]);
|
||||
}
|
||||
|
||||
private
|
||||
Int_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** UNSIGNED INT to and from bytes */
|
||||
|
||||
/**
|
||||
* UNSIGNED INT to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class UInt_ {
|
||||
private
|
||||
UInt_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
UInteger from(byte[] bytes, int offset, int bytenum) {
|
||||
int number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 4: number |= (bytes[offset+3] & 0xFF) << 24;
|
||||
case 3: number |= (bytes[offset+2] & 0xFF) << 16;
|
||||
case 2: number |= (bytes[offset+1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[offset+0] & 0xFF) << 0;
|
||||
case 4:
|
||||
number |= (bytes[offset + 3] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (bytes[offset + 2] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (bytes[offset + 1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[offset + 0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UInteger.valueOf(number);
|
||||
|
@ -387,20 +409,25 @@ public class LittleEndian {
|
|||
int number = 0;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 4: number |= (bytes[3] & 0xFF) << 24;
|
||||
case 3: number |= (bytes[2] & 0xFF) << 16;
|
||||
case 2: number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1: number |= (bytes[0] & 0xFF) << 0;
|
||||
case 4:
|
||||
number |= (bytes[3] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (bytes[2] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (bytes[1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (bytes[0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return UInteger.valueOf(number);
|
||||
}
|
||||
|
||||
public static UInteger from(byte b0, byte b1, byte b2, byte b3) {
|
||||
public static
|
||||
UInteger from(byte b0, byte b1, byte b2, byte b3) {
|
||||
int number = (b3 & 0xFF) << 24 |
|
||||
(b2 & 0xFF) << 16 |
|
||||
(b1 & 0xFF) << 8 |
|
||||
(b0 & 0xFF) << 0;
|
||||
(b1 & 0xFF) << 8 |
|
||||
(b0 & 0xFF) << 0;
|
||||
|
||||
return UInteger.valueOf(number);
|
||||
}
|
||||
|
@ -409,11 +436,8 @@ public class LittleEndian {
|
|||
byte[] toBytes(UInteger x) {
|
||||
long num = x.longValue();
|
||||
|
||||
return new byte[] {(byte) (num & 0x000000FFL >> 0),
|
||||
(byte) ((num & 0x0000FF00L) >> 8),
|
||||
(byte) ((num & 0x00FF0000L) >> 16),
|
||||
(byte) ((num & 0xFF000000L) >> 24)
|
||||
};
|
||||
return new byte[] {(byte) (num & 0x000000FFL >> 0), (byte) ((num & 0x0000FF00L) >> 8), (byte) ((num & 0x00FF0000L) >> 16),
|
||||
(byte) ((num & 0xFF000000L) >> 24)};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -430,29 +454,40 @@ public class LittleEndian {
|
|||
|
||||
return from(b[0], b[1], b[2], b[3]);
|
||||
}
|
||||
|
||||
private
|
||||
UInt_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** LONG to and from bytes */
|
||||
|
||||
/**
|
||||
* LONG to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class Long_ {
|
||||
private
|
||||
Long_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
long from(byte[] bytes, int offset, int bytenum) {
|
||||
long number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 8: number |= (long) (bytes[offset+7] & 0xFF) << 56;
|
||||
case 7: number |= (long) (bytes[offset+6] & 0xFF) << 48;
|
||||
case 6: number |= (long) (bytes[offset+5] & 0xFF) << 40;
|
||||
case 5: number |= (long) (bytes[offset+4] & 0xFF) << 32;
|
||||
case 4: number |= (long) (bytes[offset+3] & 0xFF) << 24;
|
||||
case 3: number |= (long) (bytes[offset+2] & 0xFF) << 16;
|
||||
case 2: number |= (long) (bytes[offset+1] & 0xFF) << 8;
|
||||
case 1: number |= (long) (bytes[offset+0] & 0xFF) << 0;
|
||||
case 8:
|
||||
number |= (long) (bytes[offset + 7] & 0xFF) << 56;
|
||||
case 7:
|
||||
number |= (long) (bytes[offset + 6] & 0xFF) << 48;
|
||||
case 6:
|
||||
number |= (long) (bytes[offset + 5] & 0xFF) << 40;
|
||||
case 5:
|
||||
number |= (long) (bytes[offset + 4] & 0xFF) << 32;
|
||||
case 4:
|
||||
number |= (long) (bytes[offset + 3] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (long) (bytes[offset + 2] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (long) (bytes[offset + 1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (long) (bytes[offset + 0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -464,14 +499,22 @@ public class LittleEndian {
|
|||
long number = 0L;
|
||||
|
||||
switch (bytes.length) {
|
||||
case 8: number |= (long) (bytes[7] & 0xFF) << 56;
|
||||
case 7: number |= (long) (bytes[6] & 0xFF) << 48;
|
||||
case 6: number |= (long) (bytes[5] & 0xFF) << 40;
|
||||
case 5: number |= (long) (bytes[4] & 0xFF) << 32;
|
||||
case 4: number |= (long) (bytes[3] & 0xFF) << 24;
|
||||
case 3: number |= (long) (bytes[2] & 0xFF) << 16;
|
||||
case 2: number |= (long) (bytes[1] & 0xFF) << 8;
|
||||
case 1: number |= (long) (bytes[0] & 0xFF) << 0;
|
||||
case 8:
|
||||
number |= (long) (bytes[7] & 0xFF) << 56;
|
||||
case 7:
|
||||
number |= (long) (bytes[6] & 0xFF) << 48;
|
||||
case 6:
|
||||
number |= (long) (bytes[5] & 0xFF) << 40;
|
||||
case 5:
|
||||
number |= (long) (bytes[4] & 0xFF) << 32;
|
||||
case 4:
|
||||
number |= (long) (bytes[3] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (long) (bytes[2] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (long) (bytes[1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (long) (bytes[0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return number;
|
||||
|
@ -485,21 +528,14 @@ public class LittleEndian {
|
|||
(long) (b4 & 0xFF) << 32 |
|
||||
(long) (b3 & 0xFF) << 24 |
|
||||
(long) (b2 & 0xFF) << 16 |
|
||||
(long) (b1 & 0xFF) << 8 |
|
||||
(long) (b0 & 0xFF) << 0;
|
||||
(long) (b1 & 0xFF) << 8 |
|
||||
(long) (b0 & 0xFF) << 0;
|
||||
}
|
||||
|
||||
public static
|
||||
byte[] toBytes (long x) {
|
||||
return new byte[] {(byte) (x >> 0),
|
||||
(byte) (x >> 8),
|
||||
(byte) (x >> 16),
|
||||
(byte) (x >> 24),
|
||||
(byte) (x >> 32),
|
||||
(byte) (x >> 40),
|
||||
(byte) (x >> 48),
|
||||
(byte) (x >> 56),
|
||||
};
|
||||
byte[] toBytes(long x) {
|
||||
return new byte[] {(byte) (x >> 0), (byte) (x >> 8), (byte) (x >> 16), (byte) (x >> 24), (byte) (x >> 32), (byte) (x >> 40),
|
||||
(byte) (x >> 48), (byte) (x >> 56),};
|
||||
}
|
||||
|
||||
public static
|
||||
|
@ -516,29 +552,40 @@ public class LittleEndian {
|
|||
|
||||
return from(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
|
||||
}
|
||||
|
||||
private
|
||||
Long_() {
|
||||
}
|
||||
}
|
||||
|
||||
/** UNSIGNED LONG to and from bytes */
|
||||
|
||||
/**
|
||||
* UNSIGNED LONG to and from bytes
|
||||
*/
|
||||
public static final
|
||||
class ULong_ {
|
||||
private
|
||||
ULong_() {
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static
|
||||
ULong from(byte[] bytes, int offset, int bytenum) {
|
||||
long number = 0;
|
||||
|
||||
switch (bytenum) {
|
||||
case 8: number |= (long) (bytes[offset+7] & 0xFF) << 56;
|
||||
case 7: number |= (long) (bytes[offset+6] & 0xFF) << 48;
|
||||
case 6: number |= (long) (bytes[offset+5] & 0xFF) << 40;
|
||||
case 5: number |= (long) (bytes[offset+4] & 0xFF) << 32;
|
||||
case 4: number |= (long) (bytes[offset+3] & 0xFF) << 24;
|
||||
case 3: number |= (long) (bytes[offset+2] & 0xFF) << 16;
|
||||
case 2: number |= (long) (bytes[offset+1] & 0xFF) << 8;
|
||||
case 1: number |= (long) (bytes[offset+0] & 0xFF) << 0;
|
||||
case 8:
|
||||
number |= (long) (bytes[offset + 7] & 0xFF) << 56;
|
||||
case 7:
|
||||
number |= (long) (bytes[offset + 6] & 0xFF) << 48;
|
||||
case 6:
|
||||
number |= (long) (bytes[offset + 5] & 0xFF) << 40;
|
||||
case 5:
|
||||
number |= (long) (bytes[offset + 4] & 0xFF) << 32;
|
||||
case 4:
|
||||
number |= (long) (bytes[offset + 3] & 0xFF) << 24;
|
||||
case 3:
|
||||
number |= (long) (bytes[offset + 2] & 0xFF) << 16;
|
||||
case 2:
|
||||
number |= (long) (bytes[offset + 1] & 0xFF) << 8;
|
||||
case 1:
|
||||
number |= (long) (bytes[offset + 0] & 0xFF) << 0;
|
||||
}
|
||||
|
||||
return ULong.valueOf(number);
|
||||
|
@ -558,18 +605,20 @@ public class LittleEndian {
|
|||
}
|
||||
|
||||
public static
|
||||
byte[] toBytes (ULong x) {
|
||||
byte[] toBytes(ULong x) {
|
||||
byte[] bytes = new byte[8];
|
||||
int offset = 0;
|
||||
|
||||
byte temp_byte[] = x.toBigInteger().toByteArray();
|
||||
int array_count = temp_byte.length-1;
|
||||
byte temp_byte[] = x.toBigInteger()
|
||||
.toByteArray();
|
||||
int array_count = temp_byte.length - 1;
|
||||
|
||||
for (int i=7;i>=0;i--) {
|
||||
for (int i = 7; i >= 0; i--) {
|
||||
if (array_count >= 0) {
|
||||
bytes[offset] = temp_byte[array_count];
|
||||
} else {
|
||||
bytes[offset] = (byte)00;
|
||||
}
|
||||
else {
|
||||
bytes[offset] = (byte) 00;
|
||||
}
|
||||
|
||||
offset++;
|
||||
|
@ -593,6 +642,10 @@ public class LittleEndian {
|
|||
|
||||
return from(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
|
||||
}
|
||||
|
||||
private
|
||||
ULong_() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -12,6 +12,25 @@
|
|||
* 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.
|
||||
*
|
||||
* Copyright (c) 2008, Nathan Sweet
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* - Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
||||
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package dorkbox.util.bytes;
|
||||
|
||||
|
|
|
@ -12,6 +12,25 @@
|
|||
* 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.
|
||||
*
|
||||
* Copyright (c) 2008, Nathan Sweet
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* - Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
||||
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package dorkbox.util.bytes;
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2011 See AUTHORS file.
|
||||
* Copyright 2010 Mario Zechner (contact@badlogicgames.com), Nathan Sweet (admin@esotericsoftware.com)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -19,10 +19,10 @@
|
|||
package dorkbox.util.collections;
|
||||
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import dorkbox.util.MathUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/** A resizable, ordered or unordered int array. Avoids the boxing that occurs with ArrayList<Integer>. If unordered, this class
|
||||
* avoids a memory copy when removing elements (the last element is moved to the removed element's position).
|
||||
* @author Nathan Sweet */
|
||||
|
@ -381,4 +381,4 @@ public class IntArray {
|
|||
}
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2011 See AUTHORS file.
|
||||
* Copyright 2010 Mario Zechner (contact@badlogicgames.com), Nathan Sweet (admin@esotericsoftware.com)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -19,11 +19,11 @@
|
|||
package dorkbox.util.collections;
|
||||
|
||||
|
||||
import dorkbox.util.MathUtils;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
import dorkbox.util.MathUtils;
|
||||
|
||||
/** An unordered map that uses int keys. This implementation is a cuckoo hash map using 3 hashes, random walking, and a small stash
|
||||
* for problematic keys. Null values are allowed. No allocation is done except when growing the table size. <br>
|
||||
* <br>
|
||||
|
@ -867,4 +867,4 @@ public class IntMap<V> {
|
|||
return array;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2011 See AUTHORS file.
|
||||
* Copyright 2010 Mario Zechner (contact@badlogicgames.com), Nathan Sweet (admin@esotericsoftware.com)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -24,15 +24,19 @@ import org.bouncycastle.jcajce.provider.util.DigestFactory;
|
|||
import org.bouncycastle.operator.OperatorCreationException;
|
||||
import org.bouncycastle.operator.bc.BcContentSignerBuilder;
|
||||
|
||||
public class BcECDSAContentSignerBuilder extends BcContentSignerBuilder {
|
||||
public
|
||||
class BcECDSAContentSignerBuilder extends BcContentSignerBuilder {
|
||||
|
||||
public BcECDSAContentSignerBuilder(AlgorithmIdentifier sigAlgId, AlgorithmIdentifier digAlgId) {
|
||||
public
|
||||
BcECDSAContentSignerBuilder(AlgorithmIdentifier sigAlgId, AlgorithmIdentifier digAlgId) {
|
||||
super(sigAlgId, digAlgId);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Signer createSigner(AlgorithmIdentifier sigAlgId, AlgorithmIdentifier digAlgId) throws OperatorCreationException {
|
||||
Digest digest = DigestFactory.getDigest(digAlgId.getAlgorithm().getId()); // SHA1, SHA512, etc
|
||||
protected
|
||||
Signer createSigner(AlgorithmIdentifier sigAlgId, AlgorithmIdentifier digAlgId) throws OperatorCreationException {
|
||||
Digest digest = DigestFactory.getDigest(digAlgId.getAlgorithm()
|
||||
.getId()); // SHA1, SHA512, etc
|
||||
|
||||
return new DSADigestSigner(new ECDSASigner(), digest);
|
||||
}
|
||||
|
|
|
@ -15,8 +15,6 @@
|
|||
*/
|
||||
package dorkbox.util.crypto.signers;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
|
||||
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
|
||||
import org.bouncycastle.crypto.Digest;
|
||||
|
@ -31,22 +29,29 @@ import org.bouncycastle.operator.DigestAlgorithmIdentifierFinder;
|
|||
import org.bouncycastle.operator.OperatorCreationException;
|
||||
import org.bouncycastle.operator.bc.BcContentVerifierProviderBuilder;
|
||||
|
||||
public class BcECDSAContentVerifierProviderBuilder extends BcContentVerifierProviderBuilder {
|
||||
import java.io.IOException;
|
||||
|
||||
public
|
||||
class BcECDSAContentVerifierProviderBuilder extends BcContentVerifierProviderBuilder {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public BcECDSAContentVerifierProviderBuilder(DigestAlgorithmIdentifierFinder digestAlgorithmFinder) {
|
||||
public
|
||||
BcECDSAContentVerifierProviderBuilder(DigestAlgorithmIdentifierFinder digestAlgorithmFinder) {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Signer createSigner(AlgorithmIdentifier sigAlgId) throws OperatorCreationException {
|
||||
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
|
||||
|
||||
Digest digest = DigestFactory.getDigest(digAlgId.getAlgorithm().getId()); // 1.2.23.4.5.6, etc
|
||||
return new DSADigestSigner(new ECDSASigner(), digest);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AsymmetricKeyParameter extractKeyParameters(SubjectPublicKeyInfo publicKeyInfo) throws IOException {
|
||||
protected
|
||||
AsymmetricKeyParameter extractKeyParameters(SubjectPublicKeyInfo publicKeyInfo) throws IOException {
|
||||
return PublicKeyFactory.createKey(publicKeyInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected
|
||||
Signer createSigner(AlgorithmIdentifier sigAlgId) throws OperatorCreationException {
|
||||
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
|
||||
|
||||
Digest digest = DigestFactory.getDigest(digAlgId.getAlgorithm()
|
||||
.getId()); // 1.2.23.4.5.6, etc
|
||||
return new DSADigestSigner(new ECDSASigner(), digest);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2014 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.database;
|
||||
|
||||
import dorkbox.util.bytes.ByteArrayWrapper;
|
||||
|
|
|
@ -28,6 +28,4 @@ class DatabaseStorage {
|
|||
public static final ByteArrayWrapper ADMIN_HASH = ByteArrayWrapper.wrap("adminHash");
|
||||
public static final ByteArrayWrapper FILES = ByteArrayWrapper.wrap("files");
|
||||
public static final ByteArrayWrapper GENERIC = ByteArrayWrapper.wrap("generic");
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
*/
|
||||
package dorkbox.util.entropy;
|
||||
|
||||
import dorkbox.network.util.exceptions.InitializationException;
|
||||
import dorkbox.util.exceptions.InitializationException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.entropy;
|
||||
|
||||
public
|
||||
interface EntropyProvider {
|
||||
|
||||
byte[] get(String messageForUser) throws Exception;
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.entropy;
|
||||
|
||||
import java.security.SecureRandom;
|
||||
|
||||
public
|
||||
class SimpleEntropy implements EntropyProvider {
|
||||
|
||||
public static
|
||||
Object create() {
|
||||
return new SimpleEntropy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public
|
||||
byte[] get(String ignored) throws Exception {
|
||||
System.err.println("Using simple entropy (SecureRandom) without input mixing.");
|
||||
SecureRandom secureRandom = new SecureRandom();
|
||||
byte[] rand = new byte[256];
|
||||
secureRandom.nextBytes(rand);
|
||||
return rand;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.exceptions;
|
||||
|
||||
public
|
||||
class InitializationException extends Exception {
|
||||
|
||||
private static final long serialVersionUID = 3331031046821855954L;
|
||||
|
||||
public
|
||||
InitializationException() {
|
||||
super();
|
||||
}
|
||||
|
||||
public
|
||||
InitializationException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public
|
||||
InitializationException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public
|
||||
InitializationException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.exceptions;
|
||||
|
||||
public
|
||||
class NetException extends RuntimeException {
|
||||
|
||||
private static final long serialVersionUID = -3499720814336253695L;
|
||||
|
||||
public
|
||||
NetException() {
|
||||
super();
|
||||
}
|
||||
|
||||
public
|
||||
NetException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public
|
||||
NetException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public
|
||||
NetException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.exceptions;
|
||||
|
||||
public
|
||||
class SecurityException extends Exception {
|
||||
|
||||
private static final long serialVersionUID = -1031633076501715224L;
|
||||
|
||||
public
|
||||
SecurityException() {
|
||||
super();
|
||||
}
|
||||
|
||||
public
|
||||
SecurityException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public
|
||||
SecurityException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public
|
||||
SecurityException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
|
@ -23,20 +23,23 @@ import java.io.InputStreamReader;
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class GwtSymbolMapParser {
|
||||
public
|
||||
class GwtSymbolMapParser {
|
||||
|
||||
private final Map<String, String> symbolMap;
|
||||
|
||||
public GwtSymbolMapParser() {
|
||||
public
|
||||
GwtSymbolMapParser() {
|
||||
this.symbolMap = new HashMap<String, String>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Efficiently parses the inputstream for symbolmap information.
|
||||
* <p>
|
||||
* <p/>
|
||||
* Automatically closes the input stream when finished.
|
||||
*/
|
||||
public void parse(InputStream inputStream) {
|
||||
public
|
||||
void parse(InputStream inputStream) {
|
||||
if (inputStream == null) {
|
||||
return;
|
||||
}
|
||||
|
@ -54,7 +57,8 @@ public class GwtSymbolMapParser {
|
|||
|
||||
if (CHAR != '\r' && CHAR != '\n') {
|
||||
builder.append(CHAR);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
processLine(builder.toString());
|
||||
// new line!
|
||||
builder.delete(0, builder.capacity());
|
||||
|
@ -70,11 +74,13 @@ public class GwtSymbolMapParser {
|
|||
}
|
||||
}
|
||||
|
||||
public Map<String, String> getSymbolMap() {
|
||||
public
|
||||
Map<String, String> getSymbolMap() {
|
||||
return this.symbolMap;
|
||||
}
|
||||
|
||||
public void processLine(String line) {
|
||||
public
|
||||
void processLine(String line) {
|
||||
if (line.charAt(0) == '#') {
|
||||
return;
|
||||
}
|
||||
|
@ -124,7 +130,8 @@ public class GwtSymbolMapParser {
|
|||
// System.err.println(jsName + " : " + memberName + " : " + className);
|
||||
this.symbolMap.put(jsName, className);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// version 2
|
||||
// The list has already been pruned, so always put everything into the symbol map
|
||||
this.symbolMap.put(symbolInfo[0], symbolInfo[1]);
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.jna.linux;
|
||||
|
||||
import com.sun.jna.*;
|
||||
|
|
|
@ -1,6 +1,20 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.jna.linux;
|
||||
|
||||
|
||||
import com.sun.jna.Library;
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.Pointer;
|
||||
|
|
|
@ -1,6 +1,20 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.jna.linux;
|
||||
|
||||
|
||||
import com.sun.jna.*;
|
||||
import dorkbox.util.Keep;
|
||||
import dorkbox.util.jna.linux.Gtk.GdkEventButton;
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.jna.linux;
|
||||
|
||||
import com.sun.jna.Library;
|
||||
|
|
|
@ -1,8 +1,22 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.jna.linux;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
|
||||
public
|
||||
class GtkSupport {
|
||||
public static final boolean isSupported;
|
||||
|
|
|
@ -1,8 +1,20 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.parallel;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public
|
||||
interface ParallelCollector<T extends ParallelTask> {
|
||||
/**
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.parallel;
|
||||
|
||||
import dorkbox.util.messagebus.common.thread.NamedThreadFactory;
|
||||
|
@ -10,9 +25,6 @@ import org.slf4j.Logger;
|
|||
import java.util.ArrayList;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public
|
||||
class ParallelProcessor<T extends ParallelTask> {
|
||||
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2015 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.parallel;
|
||||
|
||||
public abstract
|
||||
|
|
|
@ -15,76 +15,153 @@
|
|||
*/
|
||||
package dorkbox.util.process;
|
||||
|
||||
import dorkbox.util.FileUtil;
|
||||
import dorkbox.util.OS;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import dorkbox.util.FileUtil;
|
||||
import dorkbox.util.OS;
|
||||
|
||||
/**
|
||||
* This will FORK the java process initially used to start the currently running JVM. Changing the java executable will change this behaviors
|
||||
*/
|
||||
public class JavaProcessBuilder extends ShellProcessBuilder {
|
||||
public
|
||||
class JavaProcessBuilder extends ShellProcessBuilder {
|
||||
|
||||
/**
|
||||
* The directory into which a local VM installation should be unpacked.
|
||||
*/
|
||||
public static final String LOCAL_JAVA_DIR = "java_vm";
|
||||
|
||||
/**
|
||||
* Reconstructs the path to the JVM used to launch this process.
|
||||
*
|
||||
* @param windebug if true we will use java.exe instead of javaw.exe on Windows.
|
||||
*/
|
||||
public static
|
||||
String getJVMPath(File appdir, boolean windebug) {
|
||||
// first look in our application directory for an installed VM
|
||||
String vmpath = checkJvmPath(new File(appdir, LOCAL_JAVA_DIR).getPath(), windebug);
|
||||
|
||||
// then fall back to the VM in which we're already running
|
||||
if (vmpath == null) {
|
||||
vmpath = checkJvmPath(System.getProperty("java.home"), windebug);
|
||||
}
|
||||
|
||||
// then throw up our hands and hope for the best
|
||||
if (vmpath == null) {
|
||||
System.err.println("Unable to find java [appdir=" + appdir + ", java.home=" + System.getProperty("java.home") + "]!");
|
||||
vmpath = "java";
|
||||
}
|
||||
|
||||
// Oddly, the Mac OS X specific java flag -Xdock:name will only work if java is launched
|
||||
// from /usr/bin/java, and not if launched by directly referring to <java.home>/bin/java,
|
||||
// even though the former is a symlink to the latter! To work around this, see if the
|
||||
// desired jvm is in fact pointed to by /usr/bin/java and, if so, use that instead.
|
||||
if (OS.isMacOsX()) {
|
||||
String localVM = FileUtil.normalize(new File("/usr/bin/java").getAbsolutePath());
|
||||
String vmCheck = FileUtil.normalize(new File(vmpath).getAbsolutePath());
|
||||
if (localVM.equals(vmCheck)) {
|
||||
vmpath = "/usr/bin/java";
|
||||
}
|
||||
}
|
||||
|
||||
return vmpath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a Java Virtual Machine can be located in the supplied path.
|
||||
*/
|
||||
private static
|
||||
String checkJvmPath(String vmhome, boolean windebug) {
|
||||
// linux does this...
|
||||
String vmbase = vmhome + File.separator + "bin" + File.separator;
|
||||
String vmpath = vmbase + "java";
|
||||
if (new File(vmpath).exists()) {
|
||||
return vmpath;
|
||||
}
|
||||
|
||||
// windows does this
|
||||
if (!windebug) {
|
||||
vmpath = vmbase + "javaw.exe";
|
||||
}
|
||||
else {
|
||||
vmpath = vmbase + "java.exe"; // open a console on windows
|
||||
}
|
||||
|
||||
if (new File(vmpath).exists()) {
|
||||
return vmpath;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
// this is NOT related to JAVA_HOME, but is instead the location of the JRE that was used to launch java initially.
|
||||
private String javaLocation = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
|
||||
private String mainClass;
|
||||
private int startingHeapSizeInMegabytes = 40;
|
||||
private int maximumHeapSizeInMegabytes = 128;
|
||||
|
||||
private List<String> jvmOptions = new ArrayList<String>();
|
||||
private List<String> classpathEntries = new ArrayList<String>();
|
||||
private List<String> mainClassArguments = new ArrayList<String>();
|
||||
|
||||
private String jarFile;
|
||||
|
||||
public JavaProcessBuilder() {
|
||||
super(null, null, null);
|
||||
}
|
||||
|
||||
// what version of java??
|
||||
// so, this starts a NEW java, from an ALREADY existing java.
|
||||
private List<String> mainClassArguments = new ArrayList<String>();
|
||||
private String jarFile;
|
||||
|
||||
public JavaProcessBuilder(InputStream in, PrintStream out, PrintStream err) {
|
||||
public
|
||||
JavaProcessBuilder() {
|
||||
super(null, null, null);
|
||||
}
|
||||
|
||||
public
|
||||
JavaProcessBuilder(InputStream in, PrintStream out, PrintStream err) {
|
||||
super(in, out, err);
|
||||
}
|
||||
|
||||
public final void setMainClass(String mainClass) {
|
||||
public final
|
||||
void setMainClass(String mainClass) {
|
||||
this.mainClass = mainClass;
|
||||
}
|
||||
|
||||
public final void setStartingHeapSizeInMegabytes(int startingHeapSizeInMegabytes) {
|
||||
public final
|
||||
void setStartingHeapSizeInMegabytes(int startingHeapSizeInMegabytes) {
|
||||
this.startingHeapSizeInMegabytes = startingHeapSizeInMegabytes;
|
||||
}
|
||||
|
||||
public final void setMaximumHeapSizeInMegabytes(int maximumHeapSizeInMegabytes) {
|
||||
public final
|
||||
void setMaximumHeapSizeInMegabytes(int maximumHeapSizeInMegabytes) {
|
||||
this.maximumHeapSizeInMegabytes = maximumHeapSizeInMegabytes;
|
||||
}
|
||||
|
||||
public final void addJvmClasspath(String classpathEntry) {
|
||||
public final
|
||||
void addJvmClasspath(String classpathEntry) {
|
||||
this.classpathEntries.add(classpathEntry);
|
||||
}
|
||||
|
||||
public final void addJvmClasspaths(List<String> paths) {
|
||||
public final
|
||||
void addJvmClasspaths(List<String> paths) {
|
||||
this.classpathEntries.addAll(paths);
|
||||
}
|
||||
|
||||
public final void addJvmOption(String argument) {
|
||||
public final
|
||||
void addJvmOption(String argument) {
|
||||
this.jvmOptions.add(argument);
|
||||
}
|
||||
|
||||
public final void addJvmOptions(List<String> paths) {
|
||||
public final
|
||||
void addJvmOptions(List<String> paths) {
|
||||
this.jvmOptions.addAll(paths);
|
||||
}
|
||||
|
||||
public final void setJarFile(String jarFile) {
|
||||
public final
|
||||
void setJarFile(String jarFile) {
|
||||
this.jarFile = jarFile;
|
||||
}
|
||||
|
||||
private String getClasspath() {
|
||||
private
|
||||
String getClasspath() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int count = 0;
|
||||
final int totalSize = this.classpathEntries.size();
|
||||
|
@ -116,12 +193,14 @@ public class JavaProcessBuilder extends ShellProcessBuilder {
|
|||
* Specify the JAVA exectuable to launch this process. By default, this will use the same java exectuable
|
||||
* as was used to start the current JVM.
|
||||
*/
|
||||
public void setJava(String javaLocation) {
|
||||
public
|
||||
void setJava(String javaLocation) {
|
||||
this.javaLocation = javaLocation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
public
|
||||
void start() {
|
||||
setExecutable(this.javaLocation);
|
||||
|
||||
// save off the original arguments
|
||||
|
@ -165,7 +244,8 @@ public class JavaProcessBuilder extends ShellProcessBuilder {
|
|||
|
||||
// main class must happen AFTER the classpath!
|
||||
this.arguments.add(this.mainClass);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
System.err.println("WHOOPS. You must specify a jar or main class when running java!");
|
||||
System.exit(1);
|
||||
}
|
||||
|
@ -179,7 +259,8 @@ public class JavaProcessBuilder extends ShellProcessBuilder {
|
|||
for (String s : split) {
|
||||
this.arguments.add(s);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
this.arguments.add(arg);
|
||||
}
|
||||
}
|
||||
|
@ -188,69 +269,4 @@ public class JavaProcessBuilder extends ShellProcessBuilder {
|
|||
|
||||
super.start();
|
||||
}
|
||||
|
||||
|
||||
/** The directory into which a local VM installation should be unpacked. */
|
||||
public static final String LOCAL_JAVA_DIR = "java_vm";
|
||||
|
||||
/**
|
||||
* Reconstructs the path to the JVM used to launch this process.
|
||||
*
|
||||
* @param windebug if true we will use java.exe instead of javaw.exe on Windows.
|
||||
*/
|
||||
public static String getJVMPath (File appdir, boolean windebug)
|
||||
{
|
||||
// first look in our application directory for an installed VM
|
||||
String vmpath = checkJvmPath(new File(appdir, LOCAL_JAVA_DIR).getPath(), windebug);
|
||||
|
||||
// then fall back to the VM in which we're already running
|
||||
if (vmpath == null) {
|
||||
vmpath = checkJvmPath(System.getProperty("java.home"), windebug);
|
||||
}
|
||||
|
||||
// then throw up our hands and hope for the best
|
||||
if (vmpath == null) {
|
||||
System.err.println("Unable to find java [appdir=" + appdir + ", java.home=" + System.getProperty("java.home") + "]!");
|
||||
vmpath = "java";
|
||||
}
|
||||
|
||||
// Oddly, the Mac OS X specific java flag -Xdock:name will only work if java is launched
|
||||
// from /usr/bin/java, and not if launched by directly referring to <java.home>/bin/java,
|
||||
// even though the former is a symlink to the latter! To work around this, see if the
|
||||
// desired jvm is in fact pointed to by /usr/bin/java and, if so, use that instead.
|
||||
if (OS.isMacOsX()) {
|
||||
String localVM = FileUtil.normalize(new File("/usr/bin/java").getAbsolutePath());
|
||||
String vmCheck = FileUtil.normalize(new File(vmpath).getAbsolutePath());
|
||||
if (localVM.equals(vmCheck)) {
|
||||
vmpath = "/usr/bin/java";
|
||||
}
|
||||
}
|
||||
|
||||
return vmpath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a Java Virtual Machine can be located in the supplied path.
|
||||
*/
|
||||
private static String checkJvmPath(String vmhome, boolean windebug) {
|
||||
// linux does this...
|
||||
String vmbase = vmhome + File.separator + "bin" + File.separator;
|
||||
String vmpath = vmbase + "java";
|
||||
if (new File(vmpath).exists()) {
|
||||
return vmpath;
|
||||
}
|
||||
|
||||
// windows does this
|
||||
if (!windebug) {
|
||||
vmpath = vmbase + "javaw.exe";
|
||||
} else {
|
||||
vmpath = vmbase + "java.exe"; // open a console on windows
|
||||
}
|
||||
|
||||
if (new File(vmpath).exists()) {
|
||||
return vmpath;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,15 +15,16 @@
|
|||
*/
|
||||
package dorkbox.util.process;
|
||||
|
||||
import dorkbox.util.OS;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import dorkbox.util.OS;
|
||||
|
||||
public class LauncherProcessBuilder extends ShellProcessBuilder {
|
||||
public
|
||||
class LauncherProcessBuilder extends ShellProcessBuilder {
|
||||
|
||||
private String mainClass;
|
||||
|
||||
|
@ -32,31 +33,38 @@ public class LauncherProcessBuilder extends ShellProcessBuilder {
|
|||
|
||||
private String jarFile;
|
||||
|
||||
public LauncherProcessBuilder() {
|
||||
public
|
||||
LauncherProcessBuilder() {
|
||||
super(null, null, null);
|
||||
}
|
||||
|
||||
public LauncherProcessBuilder(InputStream in, PrintStream out, PrintStream err) {
|
||||
public
|
||||
LauncherProcessBuilder(InputStream in, PrintStream out, PrintStream err) {
|
||||
super(in, out, err);
|
||||
}
|
||||
|
||||
public final void setMainClass(String mainClass) {
|
||||
public final
|
||||
void setMainClass(String mainClass) {
|
||||
this.mainClass = mainClass;
|
||||
}
|
||||
|
||||
public final void addJvmClasspath(String classpathEntry) {
|
||||
public final
|
||||
void addJvmClasspath(String classpathEntry) {
|
||||
this.classpathEntries.add(classpathEntry);
|
||||
}
|
||||
|
||||
public final void addJvmClasspaths(List<String> paths) {
|
||||
public final
|
||||
void addJvmClasspaths(List<String> paths) {
|
||||
this.classpathEntries.addAll(paths);
|
||||
}
|
||||
|
||||
public final void setJarFile(String jarFile) {
|
||||
public final
|
||||
void setJarFile(String jarFile) {
|
||||
this.jarFile = jarFile;
|
||||
}
|
||||
|
||||
private String getClasspath() {
|
||||
private
|
||||
String getClasspath() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int count = 0;
|
||||
final int totalSize = this.classpathEntries.size();
|
||||
|
@ -75,10 +83,12 @@ public class LauncherProcessBuilder extends ShellProcessBuilder {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
public
|
||||
void start() {
|
||||
if (OS.isWindows()) {
|
||||
setExecutable("dorkboxc.exe");
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
setExecutable("dorkbox");
|
||||
}
|
||||
|
||||
|
@ -120,7 +130,8 @@ public class LauncherProcessBuilder extends ShellProcessBuilder {
|
|||
this.arguments.add("-classpath");
|
||||
this.arguments.add(classpath);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
System.err.println("WHOOPS. You must specify a jar or main class when running java!");
|
||||
System.exit(1);
|
||||
}
|
||||
|
@ -134,7 +145,8 @@ public class LauncherProcessBuilder extends ShellProcessBuilder {
|
|||
for (String s : split) {
|
||||
this.arguments.add(s);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
this.arguments.add(arg);
|
||||
}
|
||||
}
|
||||
|
@ -143,4 +155,4 @@ public class LauncherProcessBuilder extends ShellProcessBuilder {
|
|||
|
||||
super.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,24 +18,29 @@ package dorkbox.util.process;
|
|||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
public class NullOutputStream extends OutputStream {
|
||||
public
|
||||
class NullOutputStream extends OutputStream {
|
||||
@Override
|
||||
public void write(int i) throws IOException {
|
||||
public
|
||||
void write(int i) throws IOException {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(byte[] b) throws IOException {
|
||||
public
|
||||
void write(byte[] b) throws IOException {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(byte[] b, int off, int len) throws IOException {
|
||||
public
|
||||
void write(byte[] b, int off, int len) throws IOException {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flush() throws IOException {
|
||||
public
|
||||
void flush() throws IOException {
|
||||
//do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,13 +19,15 @@ import java.io.IOException;
|
|||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
public class ProcessProxy extends Thread {
|
||||
public
|
||||
class ProcessProxy extends Thread {
|
||||
|
||||
private final InputStream is;
|
||||
private final OutputStream os;
|
||||
|
||||
// when reading from the stdin and outputting to the process
|
||||
public ProcessProxy(String processName, InputStream inputStreamFromConsole, OutputStream outputStreamToProcess) {
|
||||
public
|
||||
ProcessProxy(String processName, InputStream inputStreamFromConsole, OutputStream outputStreamToProcess) {
|
||||
this.is = inputStreamFromConsole;
|
||||
this.os = outputStreamToProcess;
|
||||
|
||||
|
@ -33,7 +35,8 @@ public class ProcessProxy extends Thread {
|
|||
setDaemon(true);
|
||||
}
|
||||
|
||||
public void close() {
|
||||
public
|
||||
void close() {
|
||||
try {
|
||||
this.is.close();
|
||||
} catch (IOException e) {
|
||||
|
@ -41,7 +44,8 @@ public class ProcessProxy extends Thread {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
public
|
||||
void run() {
|
||||
try {
|
||||
// this thread will read until there is no more data to read. (this is generally what you want)
|
||||
// the stream will be closed when the process closes it (usually on exit)
|
||||
|
@ -51,7 +55,8 @@ public class ProcessProxy extends Thread {
|
|||
// just read so it won't block.
|
||||
while ((readInt = this.is.read()) != -1) {
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
while ((readInt = this.is.read()) != -1) {
|
||||
this.os.write(readInt);
|
||||
// always flush
|
||||
|
@ -70,4 +75,4 @@ public class ProcessProxy extends Thread {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
*/
|
||||
package dorkbox.util.process;
|
||||
|
||||
import dorkbox.util.OS;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
|
@ -22,27 +24,23 @@ import java.util.ArrayList;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import dorkbox.util.OS;
|
||||
|
||||
/**
|
||||
* If you want to save off the output from the process, set a PrintStream to the following:
|
||||
* ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(8196);
|
||||
* PrintStream outputStream = new PrintStream(byteArrayOutputStream);
|
||||
* ...
|
||||
* String output = byteArrayOutputStream.toString();
|
||||
* ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(8196);
|
||||
* PrintStream outputStream = new PrintStream(byteArrayOutputStream);
|
||||
* ...
|
||||
* String output = byteArrayOutputStream.toString();
|
||||
*/
|
||||
public class ShellProcessBuilder {
|
||||
|
||||
private String workingDirectory = null;
|
||||
private String executableName = null;
|
||||
private String executableDirectory = null;
|
||||
|
||||
protected List<String> arguments = new ArrayList<String>();
|
||||
public
|
||||
class ShellProcessBuilder {
|
||||
|
||||
private final PrintStream outputStream;
|
||||
private final PrintStream errorStream;
|
||||
private final InputStream inputStream;
|
||||
|
||||
protected List<String> arguments = new ArrayList<String>();
|
||||
private String workingDirectory = null;
|
||||
private String executableName = null;
|
||||
private String executableDirectory = null;
|
||||
private Process process = null;
|
||||
|
||||
// true if we want to save off (usually for debugging) the initial output from this
|
||||
|
@ -51,19 +49,23 @@ public class ShellProcessBuilder {
|
|||
/**
|
||||
* This will cause the spawned process to pipe it's output to null.
|
||||
*/
|
||||
public ShellProcessBuilder() {
|
||||
public
|
||||
ShellProcessBuilder() {
|
||||
this(null, null, null);
|
||||
}
|
||||
|
||||
public ShellProcessBuilder(PrintStream out) {
|
||||
public
|
||||
ShellProcessBuilder(PrintStream out) {
|
||||
this(null, out, out);
|
||||
}
|
||||
|
||||
public ShellProcessBuilder(InputStream in, PrintStream out) {
|
||||
public
|
||||
ShellProcessBuilder(InputStream in, PrintStream out) {
|
||||
this(in, out, out);
|
||||
}
|
||||
|
||||
public ShellProcessBuilder(InputStream in, PrintStream out, PrintStream err) {
|
||||
public
|
||||
ShellProcessBuilder(InputStream in, PrintStream out, PrintStream err) {
|
||||
this.outputStream = out;
|
||||
this.errorStream = err;
|
||||
this.inputStream = in;
|
||||
|
@ -72,47 +74,55 @@ public class ShellProcessBuilder {
|
|||
/**
|
||||
* When launched from eclipse, the working directory is USUALLY the root of the project folder
|
||||
*/
|
||||
public final ShellProcessBuilder setWorkingDirectory(String workingDirectory) {
|
||||
public final
|
||||
ShellProcessBuilder setWorkingDirectory(String workingDirectory) {
|
||||
// MUST be absolute path!!
|
||||
this.workingDirectory = new File(workingDirectory).getAbsolutePath();
|
||||
return this;
|
||||
}
|
||||
|
||||
public final ShellProcessBuilder addArgument(String argument) {
|
||||
public final
|
||||
ShellProcessBuilder addArgument(String argument) {
|
||||
this.arguments.add(argument);
|
||||
return this;
|
||||
}
|
||||
|
||||
public final ShellProcessBuilder addArguments(String... paths) {
|
||||
public final
|
||||
ShellProcessBuilder addArguments(String... paths) {
|
||||
for (String path : paths) {
|
||||
this.arguments.add(path);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public final ShellProcessBuilder addArguments(List<String> paths) {
|
||||
public final
|
||||
ShellProcessBuilder addArguments(List<String> paths) {
|
||||
this.arguments.addAll(paths);
|
||||
return this;
|
||||
}
|
||||
|
||||
public final ShellProcessBuilder setExecutable(String executableName) {
|
||||
public final
|
||||
ShellProcessBuilder setExecutable(String executableName) {
|
||||
this.executableName = executableName;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ShellProcessBuilder setExecutableDirectory(String executableDirectory) {
|
||||
public
|
||||
ShellProcessBuilder setExecutableDirectory(String executableDirectory) {
|
||||
// MUST be absolute path!!
|
||||
this.executableDirectory = new File(executableDirectory).getAbsolutePath();
|
||||
return this;
|
||||
}
|
||||
|
||||
public ShellProcessBuilder addDebugInfo() {
|
||||
public
|
||||
ShellProcessBuilder addDebugInfo() {
|
||||
this.debugInfo = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public void start() {
|
||||
public
|
||||
void start() {
|
||||
// if no executable, then use the command shell
|
||||
if (this.executableName == null) {
|
||||
if (OS.isWindows()) {
|
||||
|
@ -120,7 +130,8 @@ public class ShellProcessBuilder {
|
|||
this.executableName = "cmd";
|
||||
this.arguments.add(0, "/c");
|
||||
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// *nix
|
||||
this.executableName = "/bin/bash";
|
||||
File file = new File(this.executableName);
|
||||
|
@ -129,7 +140,8 @@ public class ShellProcessBuilder {
|
|||
}
|
||||
this.arguments.add(0, "-c");
|
||||
}
|
||||
} else if (this.workingDirectory != null) {
|
||||
}
|
||||
else if (this.workingDirectory != null) {
|
||||
if (!this.workingDirectory.endsWith("/") && !this.workingDirectory.endsWith("\\")) {
|
||||
this.workingDirectory += File.separator;
|
||||
}
|
||||
|
@ -154,7 +166,8 @@ public class ShellProcessBuilder {
|
|||
for (String s : split) {
|
||||
argumentsList.add(s);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
argumentsList.add(arg);
|
||||
}
|
||||
}
|
||||
|
@ -167,7 +180,8 @@ public class ShellProcessBuilder {
|
|||
if (OS.isWindows()) {
|
||||
// >NUL on windows
|
||||
argumentsList.add(">NUL");
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// we will "pipe" it to /dev/null on *nix
|
||||
argumentsList.add(">/dev/null 2>&1");
|
||||
}
|
||||
|
@ -226,7 +240,9 @@ public class ShellProcessBuilder {
|
|||
|
||||
// readers (read process -> write console)
|
||||
// have to keep the output buffers from filling in the target process.
|
||||
readFromProcess_output = new ProcessProxy("Process Reader: " + this.executableName, this.process.getInputStream(), nullOutputStream);
|
||||
readFromProcess_output = new ProcessProxy("Process Reader: " + this.executableName,
|
||||
this.process.getInputStream(),
|
||||
nullOutputStream);
|
||||
readFromProcess_error = null;
|
||||
}
|
||||
// we want to pipe our input/output from process to ourselves
|
||||
|
@ -236,10 +252,15 @@ public class ShellProcessBuilder {
|
|||
* to the user's window. This is important or the spawned process could block.
|
||||
*/
|
||||
// readers (read process -> write console)
|
||||
readFromProcess_output = new ProcessProxy("Process Reader: " + this.executableName, this.process.getInputStream(), this.outputStream);
|
||||
readFromProcess_output = new ProcessProxy("Process Reader: " + this.executableName,
|
||||
this.process.getInputStream(),
|
||||
this.outputStream);
|
||||
if (this.errorStream != this.outputStream) {
|
||||
readFromProcess_error = new ProcessProxy("Process Reader: " + this.executableName, this.process.getErrorStream(), this.errorStream);
|
||||
} else {
|
||||
readFromProcess_error = new ProcessProxy("Process Reader: " + this.executableName,
|
||||
this.process.getErrorStream(),
|
||||
this.errorStream);
|
||||
}
|
||||
else {
|
||||
processBuilder.redirectErrorStream(true);
|
||||
readFromProcess_error = null;
|
||||
}
|
||||
|
@ -250,8 +271,11 @@ public class ShellProcessBuilder {
|
|||
* Proxy System.in from the user's window to the spawned process
|
||||
*/
|
||||
// writer (read console -> write process)
|
||||
writeToProcess_input = new ProcessProxy("Process Writer: " + this.executableName, this.inputStream, this.process.getOutputStream());
|
||||
} else {
|
||||
writeToProcess_input = new ProcessProxy("Process Writer: " + this.executableName,
|
||||
this.inputStream,
|
||||
this.process.getOutputStream());
|
||||
}
|
||||
else {
|
||||
writeToProcess_input = null;
|
||||
}
|
||||
|
||||
|
@ -260,17 +284,18 @@ public class ShellProcessBuilder {
|
|||
// If not in eclipse, by this shutdown hook. (clicking the red square to terminate a process will not run it's shutdown hooks)
|
||||
// Typing "exit" will always terminate the process
|
||||
Thread hook = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (ShellProcessBuilder.this.debugInfo) {
|
||||
ShellProcessBuilder.this.errorStream.println("Terminating process: " + ShellProcessBuilder.this.executableName);
|
||||
}
|
||||
ShellProcessBuilder.this.process.destroy();
|
||||
@Override
|
||||
public
|
||||
void run() {
|
||||
if (ShellProcessBuilder.this.debugInfo) {
|
||||
ShellProcessBuilder.this.errorStream.println("Terminating process: " + ShellProcessBuilder.this.executableName);
|
||||
}
|
||||
ShellProcessBuilder.this.process.destroy();
|
||||
}
|
||||
);
|
||||
});
|
||||
// add a shutdown hook to make sure that we properly terminate our spawned processes.
|
||||
Runtime.getRuntime().addShutdownHook(hook);
|
||||
Runtime.getRuntime()
|
||||
.addShutdownHook(hook);
|
||||
|
||||
if (writeToProcess_input != null) {
|
||||
writeToProcess_input.start();
|
||||
|
@ -304,11 +329,13 @@ public class ShellProcessBuilder {
|
|||
// this is for cleanup ONLY, not to actually do anything.
|
||||
this.process.destroy();
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
Thread.currentThread()
|
||||
.interrupt();
|
||||
}
|
||||
|
||||
// remove the shutdown hook now that we've shutdown.
|
||||
Runtime.getRuntime().removeShutdownHook(hook);
|
||||
Runtime.getRuntime()
|
||||
.removeShutdownHook(hook);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,23 +15,19 @@
|
|||
*/
|
||||
package dorkbox.util.properties;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import dorkbox.util.FileUtil;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import java.util.Properties;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public
|
||||
class PropertiesProvider {
|
||||
|
||||
private String comments = "Settings and configuration file. Strings must be escape formatted!";
|
||||
private final Properties properties = new SortedProperties();
|
||||
private final File propertiesFile;
|
||||
private String comments = "Settings and configuration file. Strings must be escape formatted!";
|
||||
|
||||
public
|
||||
PropertiesProvider(String propertiesFile) {
|
||||
|
|
|
@ -15,28 +15,29 @@
|
|||
*/
|
||||
package dorkbox.util.properties;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Properties;
|
||||
import java.util.Vector;
|
||||
import java.util.*;
|
||||
|
||||
public class SortedProperties extends Properties {
|
||||
public
|
||||
class SortedProperties extends Properties {
|
||||
|
||||
private static final long serialVersionUID = 3988064683926999433L;
|
||||
|
||||
private final Comparator<Object> compare = new Comparator<Object>() {
|
||||
@Override
|
||||
public int compare(Object o1, Object o2) {
|
||||
return o1.toString().compareTo(o2.toString());
|
||||
}};
|
||||
public
|
||||
int compare(Object o1, Object o2) {
|
||||
return o1.toString()
|
||||
.compareTo(o2.toString());
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public synchronized Enumeration<Object> keys() {
|
||||
public synchronized
|
||||
Enumeration<Object> keys() {
|
||||
Enumeration<Object> keysEnum = super.keys();
|
||||
|
||||
Vector<Object> vector = new Vector<Object>(size());
|
||||
for (;keysEnum.hasMoreElements();) {
|
||||
for (; keysEnum.hasMoreElements(); ) {
|
||||
vector.add(keysEnum.nextElement());
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
package dorkbox.util.serializers;
|
||||
package dorkbox.util.serialization;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Field;
|
|
@ -1,8 +1,24 @@
|
|||
package dorkbox.util.crypto.serialization;
|
||||
|
||||
|
||||
import java.math.BigInteger;
|
||||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.serialization;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
||||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
|
||||
import org.bouncycastle.asn1.x9.X9ECParameters;
|
||||
import org.bouncycastle.crypto.ec.CustomNamedCurves;
|
||||
|
@ -12,22 +28,16 @@ import org.bouncycastle.math.ec.ECAccessor;
|
|||
import org.bouncycastle.math.ec.ECCurve;
|
||||
import org.bouncycastle.math.ec.ECPoint;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
||||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Only public keys are ever sent across the wire.
|
||||
* Only public keys are ever sent across the wire.
|
||||
*/
|
||||
public class EccPrivateKeySerializer extends Serializer<ECPrivateKeyParameters> {
|
||||
public
|
||||
class EccPrivateKeySerializer extends Serializer<ECPrivateKeyParameters> {
|
||||
|
||||
@Override
|
||||
public void write(Kryo kryo, Output output, ECPrivateKeyParameters key) {
|
||||
write(output, key);
|
||||
}
|
||||
|
||||
public static void write(Output output, ECPrivateKeyParameters key) {
|
||||
public static
|
||||
void write(Output output, ECPrivateKeyParameters key) {
|
||||
byte[] bytes;
|
||||
int length;
|
||||
|
||||
|
@ -51,19 +61,15 @@ public class EccPrivateKeySerializer extends Serializer<ECPrivateKeyParameters>
|
|||
serializeECPoint(g, output);
|
||||
|
||||
/////////////
|
||||
bytes = key.getD().toByteArray();
|
||||
bytes = key.getD()
|
||||
.toByteArray();
|
||||
length = bytes.length;
|
||||
output.writeInt(length, true);
|
||||
output.writeBytes(bytes, 0, length);
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public ECPrivateKeyParameters read(Kryo kryo, Input input, Class type) {
|
||||
return read(input);
|
||||
}
|
||||
|
||||
public static ECPrivateKeyParameters read(Input input) {
|
||||
public static
|
||||
ECPrivateKeyParameters read(Input input) {
|
||||
byte[] bytes;
|
||||
int length;
|
||||
|
||||
|
@ -98,11 +104,13 @@ public class EccPrivateKeySerializer extends Serializer<ECPrivateKeyParameters>
|
|||
return new ECPrivateKeyParameters(D, ecDomainParameters);
|
||||
}
|
||||
|
||||
static void serializeCurve(Output output, ECCurve curve) {
|
||||
static
|
||||
void serializeCurve(Output output, ECCurve curve) {
|
||||
byte[] bytes;
|
||||
int length;
|
||||
// save out if it's a NAMED curve, or a UN-NAMED curve. If it is named, we can do less work.
|
||||
String curveName = curve.getClass().getSimpleName();
|
||||
String curveName = curve.getClass()
|
||||
.getSimpleName();
|
||||
if (curveName.endsWith("Curve")) {
|
||||
String cleanedName = curveName.substring(0, curveName.indexOf("Curve"));
|
||||
|
||||
|
@ -121,11 +129,14 @@ public class EccPrivateKeySerializer extends Serializer<ECPrivateKeyParameters>
|
|||
// we have to serialize the ENTIRE curve.
|
||||
if (curveName == null) {
|
||||
// save out the curve info
|
||||
BigInteger a = curve.getA().toBigInteger();
|
||||
BigInteger b = curve.getB().toBigInteger();
|
||||
BigInteger a = curve.getA()
|
||||
.toBigInteger();
|
||||
BigInteger b = curve.getB()
|
||||
.toBigInteger();
|
||||
BigInteger order = curve.getOrder();
|
||||
BigInteger cofactor = curve.getCofactor();
|
||||
BigInteger q = curve.getField().getCharacteristic();
|
||||
BigInteger q = curve.getField()
|
||||
.getCharacteristic();
|
||||
|
||||
/////////////
|
||||
bytes = a.toByteArray();
|
||||
|
@ -166,7 +177,8 @@ public class EccPrivateKeySerializer extends Serializer<ECPrivateKeyParameters>
|
|||
}
|
||||
}
|
||||
|
||||
static ECCurve deserializeCurve(Input input) {
|
||||
static
|
||||
ECCurve deserializeCurve(Input input) {
|
||||
byte[] bytes;
|
||||
int length;
|
||||
|
||||
|
@ -221,15 +233,18 @@ public class EccPrivateKeySerializer extends Serializer<ECPrivateKeyParameters>
|
|||
return curve;
|
||||
}
|
||||
|
||||
static void serializeECPoint(ECPoint point, Output output) {
|
||||
static
|
||||
void serializeECPoint(ECPoint point, Output output) {
|
||||
if (point.isInfinity()) {
|
||||
return;
|
||||
}
|
||||
|
||||
ECPoint normed = point.normalize();
|
||||
|
||||
byte[] X = normed.getXCoord().getEncoded();
|
||||
byte[] Y = normed.getYCoord().getEncoded();
|
||||
byte[] X = normed.getXCoord()
|
||||
.getEncoded();
|
||||
byte[] Y = normed.getYCoord()
|
||||
.getEncoded();
|
||||
|
||||
int length = 1 + X.length + Y.length;
|
||||
output.writeInt(length, true);
|
||||
|
@ -238,4 +253,17 @@ public class EccPrivateKeySerializer extends Serializer<ECPrivateKeyParameters>
|
|||
output.write(X);
|
||||
output.write(Y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public
|
||||
void write(Kryo kryo, Output output, ECPrivateKeyParameters key) {
|
||||
write(output, key);
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public
|
||||
ECPrivateKeyParameters read(Kryo kryo, Input input, Class type) {
|
||||
return read(input);
|
||||
}
|
||||
}
|
|
@ -1,5 +1,19 @@
|
|||
package dorkbox.util.crypto.serialization;
|
||||
|
||||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.serialization;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
||||
|
@ -18,12 +32,6 @@ import java.math.BigInteger;
|
|||
public
|
||||
class EccPublicKeySerializer extends Serializer<ECPublicKeyParameters> {
|
||||
|
||||
@Override
|
||||
public
|
||||
void write(Kryo kryo, Output output, ECPublicKeyParameters key) {
|
||||
write(output, key);
|
||||
}
|
||||
|
||||
public static
|
||||
void write(Output output, ECPublicKeyParameters key) {
|
||||
byte[] bytes;
|
||||
|
@ -50,13 +58,6 @@ class EccPublicKeySerializer extends Serializer<ECPublicKeyParameters> {
|
|||
EccPrivateKeySerializer.serializeECPoint(key.getQ(), output);
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public
|
||||
ECPublicKeyParameters read(Kryo kryo, Input input, Class type) {
|
||||
return read(input);
|
||||
}
|
||||
|
||||
public static
|
||||
ECPublicKeyParameters read(Input input) {
|
||||
byte[] bytes;
|
||||
|
@ -93,4 +94,17 @@ class EccPublicKeySerializer extends Serializer<ECPublicKeyParameters> {
|
|||
|
||||
return new ECPublicKeyParameters(Q, ecDomainParameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public
|
||||
void write(Kryo kryo, Output output, ECPublicKeyParameters key) {
|
||||
write(output, key);
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public
|
||||
ECPublicKeyParameters read(Kryo kryo, Input input, Class type) {
|
||||
return read(input);
|
||||
}
|
||||
}
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
package dorkbox.util.serializers;
|
||||
package dorkbox.util.serialization;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
|
@ -1,11 +1,25 @@
|
|||
package dorkbox.util.crypto.serialization;
|
||||
|
||||
import org.bouncycastle.crypto.params.IESParameters;
|
||||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.serialization;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
||||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
import org.bouncycastle.crypto.params.IESParameters;
|
||||
|
||||
/**
|
||||
* Only public keys are ever sent across the wire.
|
|
@ -1,11 +1,25 @@
|
|||
package dorkbox.util.crypto.serialization;
|
||||
|
||||
import org.bouncycastle.crypto.params.IESWithCipherParameters;
|
||||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.serialization;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
||||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
import org.bouncycastle.crypto.params.IESWithCipherParameters;
|
||||
|
||||
/**
|
||||
* Only public keys are ever sent across the wire.
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.serialization;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Used to identify fields that kryo should ignore when configured with the FieldAnnotationAwareSerializer
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.FIELD})
|
||||
public
|
||||
@interface IgnoreSerialization {}
|
|
@ -1,13 +1,27 @@
|
|||
package dorkbox.util.crypto.serialization;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;
|
||||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.serialization;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
||||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Only public keys are ever sent across the wire.
|
|
@ -1,13 +1,27 @@
|
|||
package dorkbox.util.crypto.serialization;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
import org.bouncycastle.crypto.params.RSAKeyParameters;
|
||||
/*
|
||||
* Copyright 2010 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.serialization;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
||||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
import org.bouncycastle.crypto.params.RSAKeyParameters;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* Only public keys are ever sent across the wire.
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
package dorkbox.util.serializers;
|
||||
package dorkbox.util.serialization;
|
||||
|
||||
import com.esotericsoftware.kryo.Kryo;
|
||||
import com.esotericsoftware.kryo.Serializer;
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2014 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.storage;
|
||||
|
||||
import dorkbox.util.bytes.ByteArrayWrapper;
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/*
|
||||
* Copyright 2014 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.storage;
|
||||
|
||||
import dorkbox.util.bytes.ByteArrayWrapper;
|
||||
|
|
|
@ -1,16 +1,30 @@
|
|||
/*
|
||||
* Copyright 2014 dorkbox, llc
|
||||
*
|
||||
* Licensed 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 dorkbox.util.storage;
|
||||
|
||||
import dorkbox.util.SerializationManager;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import dorkbox.util.SerializationManager;
|
||||
|
||||
public
|
||||
class Store {
|
||||
private static final Logger logger = LoggerFactory.getLogger(DiskStorage.class);
|
||||
|
|
|
@ -38,10 +38,10 @@ import com.esotericsoftware.kryo.Kryo;
|
|||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
|
||||
import dorkbox.util.crypto.serialization.EccPrivateKeySerializer;
|
||||
import dorkbox.util.crypto.serialization.EccPublicKeySerializer;
|
||||
import dorkbox.util.crypto.serialization.IesParametersSerializer;
|
||||
import dorkbox.util.crypto.serialization.IesWithCipherParametersSerializer;
|
||||
import dorkbox.util.serialization.EccPrivateKeySerializer;
|
||||
import dorkbox.util.serialization.EccPublicKeySerializer;
|
||||
import dorkbox.util.serialization.IesParametersSerializer;
|
||||
import dorkbox.util.serialization.IesWithCipherParametersSerializer;
|
||||
|
||||
|
||||
public class EccTest {
|
||||
|
|
|
@ -26,8 +26,8 @@ import com.esotericsoftware.kryo.Kryo;
|
|||
import com.esotericsoftware.kryo.io.Input;
|
||||
import com.esotericsoftware.kryo.io.Output;
|
||||
|
||||
import dorkbox.util.crypto.serialization.RsaPrivateKeySerializer;
|
||||
import dorkbox.util.crypto.serialization.RsaPublicKeySerializer;
|
||||
import dorkbox.util.serialization.RsaPrivateKeySerializer;
|
||||
import dorkbox.util.serialization.RsaPublicKeySerializer;
|
||||
|
||||
|
||||
public class RsaTest {
|
||||
|
|
Loading…
Reference in New Issue