diff options
Diffstat (limited to 'src/java/com/jogamp/common/util')
33 files changed, 912 insertions, 912 deletions
diff --git a/src/java/com/jogamp/common/util/ArrayHashSet.java b/src/java/com/jogamp/common/util/ArrayHashSet.java index ed3590a..a125580 100644 --- a/src/java/com/jogamp/common/util/ArrayHashSet.java +++ b/src/java/com/jogamp/common/util/ArrayHashSet.java @@ -35,7 +35,7 @@ import java.util.Iterator; import java.util.List; import java.util.ListIterator; -/** +/** * Hashed ArrayList implementation of the List and Collection interface. * * Implementation properties are: @@ -80,12 +80,12 @@ public class ArrayHashSet<E> map = new HashMap<E,E>(initialCapacity); data = new ArrayList<E>(initialCapacity); } - + public ArrayHashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,E>(initialCapacity, loadFactor); data = new ArrayList<E>(initialCapacity); } - + // // Cloneable // @@ -102,15 +102,15 @@ public class ArrayHashSet<E> return newObj; } - + /** Returns this object ordered ArrayList. Use w/ care, it's not a copy. */ public final ArrayList<E> getData() { return data; } /** Returns this object hash map. Use w/ care, it's not a copy. */ public final HashMap<E,E> getMap() { return map; } - + @Override public final String toString() { return data.toString(); } - + // // Collection // @@ -408,7 +408,7 @@ public class ArrayHashSet<E> * Identity method allowing to get the identical object, using the internal hash map. * <br> * This is an O(1) operation. - * + * * @param key hash source to find the identical Object within this list * @return object from this list, identical to the given <code>key</code> hash code, * or null if not contained diff --git a/src/java/com/jogamp/common/util/FloatStack.java b/src/java/com/jogamp/common/util/FloatStack.java index 2addd76..725491c 100644 --- a/src/java/com/jogamp/common/util/FloatStack.java +++ b/src/java/com/jogamp/common/util/FloatStack.java @@ -44,69 +44,69 @@ public class /*name*/FloatStack/*name*/ implements PrimitiveStack { private int position; private /*value*/float/*value*/[] buffer; private int growSize; - + /** * @param initialSize initial size, must be > zero * @param growSize grow size if {@link #position()} is reached, maybe <code>0</code> - * in which case an {@link IndexOutOfBoundsException} is thrown. + * in which case an {@link IndexOutOfBoundsException} is thrown. */ public /*name*/FloatStack/*name*/(int initialSize, int growSize) { this.position = 0; this.growSize = growSize; this.buffer = new /*value*/float/*value*/[initialSize]; } - + @Override public final int capacity() { return buffer.length; } - + @Override public final int position() { return position; } - + @Override public final void position(int newPosition) throws IndexOutOfBoundsException { if( 0 > position || position >= buffer.length ) { throw new IndexOutOfBoundsException("Invalid new position "+newPosition+", "+this.toString()); } - position = newPosition; + position = newPosition; } - + @Override public final int remaining() { return buffer.length - position; } - + @Override public final int getGrowSize() { return growSize; } - + @Override public final void setGrowSize(int newGrowSize) { growSize = newGrowSize; } - + public final String toString() { return "FloatStack[0..(pos "+position+").."+buffer.length+", remaining "+remaining()+"]"; } - + public final /*value*/float/*value*/[] buffer() { return buffer; } - + private final void growIfNecessary(int length) throws IndexOutOfBoundsException { if( position + length > buffer.length ) { if( 0 >= growSize ) { throw new IndexOutOfBoundsException("Out of fixed stack size: "+this); } - /*value*/float/*value*/[] newBuffer = + /*value*/float/*value*/[] newBuffer = new /*value*/float/*value*/[buffer.length + growSize]; System.arraycopy(buffer, 0, newBuffer, 0, position); buffer = newBuffer; - } + } } /** * FILO put operation - * + * * @param src source buffer - * @param srcOffset offset of src - * @param length number of float elements to put from <code>src</code> on-top this stack + * @param srcOffset offset of src + * @param length number of float elements to put from <code>src</code> on-top this stack * @return the src float[] * @throws IndexOutOfBoundsException if stack cannot grow due to zero grow-size or offset+length exceeds src. */ - public final /*value*/float/*value*/[] + public final /*value*/float/*value*/[] putOnTop(/*value*/float/*value*/[] src, int srcOffset, int length) throws IndexOutOfBoundsException { growIfNecessary(length); System.arraycopy(src, srcOffset, buffer, position, length); @@ -116,47 +116,47 @@ public class /*name*/FloatStack/*name*/ implements PrimitiveStack { /** * FILO put operation - * + * * @param src source buffer, it's position is incremented by <code>length</code> - * @param length number of float elements to put from <code>src</code> on-top this stack + * @param length number of float elements to put from <code>src</code> on-top this stack * @return the src FloatBuffer * @throws IndexOutOfBoundsException if stack cannot grow due to zero grow-size * @throws BufferUnderflowException if <code>src</code> FloatBuffer has less remaining elements than <code>length</code>. */ - public final /*value2*/FloatBuffer/*value2*/ + public final /*value2*/FloatBuffer/*value2*/ putOnTop(/*value2*/FloatBuffer/*value2*/ src, int length) throws IndexOutOfBoundsException, BufferUnderflowException { - growIfNecessary(length); + growIfNecessary(length); src.get(buffer, position, length); position += length; return src; } - + /** * FILO get operation - * + * * @param dest destination buffer - * @param destOffset offset of dest - * @param length number of float elements to get from-top this stack to <code>dest</code>. + * @param destOffset offset of dest + * @param length number of float elements to get from-top this stack to <code>dest</code>. * @return the dest float[] * @throws IndexOutOfBoundsException if stack or <code>dest</code> has less elements than <code>length</code>. */ - public final /*value*/float/*value*/[] + public final /*value*/float/*value*/[] getFromTop(/*value*/float/*value*/[] dest, int destOffset, int length) throws IndexOutOfBoundsException { System.arraycopy(buffer, position-length, dest, destOffset, length); position -= length; return dest; } - + /** * FILO get operation - * + * * @param dest destination buffer, it's position is incremented by <code>length</code>. * @param length number of float elements to get from-top this stack to <code>dest</code>. * @return the dest FloatBuffer * @throws IndexOutOfBoundsException if stack has less elements than length * @throws BufferOverflowException if <code>src</code> FloatBuffer has less remaining elements than <code>length</code>. */ - public final /*value2*/FloatBuffer/*value2*/ + public final /*value2*/FloatBuffer/*value2*/ getFromTop(/*value2*/FloatBuffer/*value2*/ dest, int length) throws IndexOutOfBoundsException, BufferOverflowException { dest.put(buffer, position-length, length); position -= length; diff --git a/src/java/com/jogamp/common/util/Function.java b/src/java/com/jogamp/common/util/Function.java index 8bec99c..9b03ce6 100644 --- a/src/java/com/jogamp/common/util/Function.java +++ b/src/java/com/jogamp/common/util/Function.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -41,9 +41,9 @@ public interface Function<R,A> { /** * Implementation may compute variable <code>args</code> list * and returns a result. - * + * * @param args variable argument list, <code>A[]</code>, maybe null * @return the result. */ R eval(A... args); -} +} diff --git a/src/java/com/jogamp/common/util/FunctionTask.java b/src/java/com/jogamp/common/util/FunctionTask.java index 01f85b1..b742d73 100644 --- a/src/java/com/jogamp/common/util/FunctionTask.java +++ b/src/java/com/jogamp/common/util/FunctionTask.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,12 +20,12 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ - + package com.jogamp.common.util; import java.io.PrintStream; @@ -41,7 +41,7 @@ public class FunctionTask<R,A> extends TaskBase implements Function<R,A> { /** * Invokes <code>func</code>. - * @param waitUntilDone if <code>true</code>, waits until <code>func</code> execution is completed, otherwise returns immediately. + * @param waitUntilDone if <code>true</code>, waits until <code>func</code> execution is completed, otherwise returns immediately. * @param func the {@link Function} to execute. * @param args the {@link Function} arguments * @return the {@link Function} return value @@ -69,14 +69,14 @@ public class FunctionTask<R,A> extends TaskBase implements Function<R,A> { } return res; } - + /** * Create a RunnableTask object w/ synchronization, - * ie. suitable for <code>invokeAndWait()</code>. - * + * ie. suitable for <code>invokeAndWait()</code>. + * * @param runnable the user action * @param syncObject the synchronization object the caller shall wait until <code>runnable</code> execution is completed, - * or <code>null</code> if waiting is not desired. + * or <code>null</code> if waiting is not desired. * @param catchExceptions Influence an occurring exception during <code>runnable</code> execution. * If <code>true</code>, the exception is silenced and can be retrieved via {@link #getThrowable()}, * otherwise the exception is thrown. @@ -96,12 +96,12 @@ public class FunctionTask<R,A> extends TaskBase implements Function<R,A> { /** * Sets the arguments for {@link #run()}. - * They will be cleared after calling {@link #run()} or {@link #eval(Object...)}. + * They will be cleared after calling {@link #run()} or {@link #eval(Object...)}. */ public final void setArgs(A... args) { this.args = args; } - + /** * Retrieves the cached result of {@link #run()} * and is cleared within this method. @@ -111,7 +111,7 @@ public class FunctionTask<R,A> extends TaskBase implements Function<R,A> { result = null; return res; } - + /** * {@inheritDoc} * <p> @@ -170,7 +170,7 @@ public class FunctionTask<R,A> extends TaskBase implements Function<R,A> { @Override public final R eval(A... args) { this.args = args; - run(); + run(); final R res = result; result = null; return res; diff --git a/src/java/com/jogamp/common/util/HashUtil.java b/src/java/com/jogamp/common/util/HashUtil.java index c5a3bff..5ce2332 100644 --- a/src/java/com/jogamp/common/util/HashUtil.java +++ b/src/java/com/jogamp/common/util/HashUtil.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -29,7 +29,7 @@ package com.jogamp.common.util; public class HashUtil { /** - * Generates a 32bit equally distributed identity hash value + * Generates a 32bit equally distributed identity hash value * from <code>addr</code> avoiding XOR collision. */ public static int getAddrHash32_EqualDist(long addr) { @@ -38,9 +38,9 @@ public class HashUtil { int hash = 31 + (int) addr ; // lo addr return ((hash << 5) - hash) + (int) ( addr >>> 32 ) ; // hi addr } - + /** - * Generates a 32bit equally distributed identity hash value + * Generates a 32bit equally distributed identity hash value * from <code>addr</code> and <code>size</code> avoiding XOR collision. */ public static int getAddrSizeHash32_EqualDist(long addr, long size) { @@ -51,9 +51,9 @@ public class HashUtil { hash = ((hash << 5) - hash) + (int) size ; // lo size return ((hash << 5) - hash) + (int) ( size >>> 32 ) ; // hi size } - + /** - * Generates a 64bit equally distributed hash value + * Generates a 64bit equally distributed hash value * from <code>addr</code> and <code>size</code> avoiding XOR collisions. */ public static long getHash64(long addr, long size) { @@ -62,5 +62,5 @@ public class HashUtil { return ((hash << 5) - hash) + size; } - + } diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java index 242f300..16f191b 100644 --- a/src/java/com/jogamp/common/util/IOUtil.java +++ b/src/java/com/jogamp/common/util/IOUtil.java @@ -56,7 +56,7 @@ import com.jogamp.common.os.Platform; public class IOUtil { public static final boolean DEBUG = Debug.debug("IOUtil"); - + /** {@value} */ public static final String SCHEME_SEPARATOR = ":"; /** {@value} */ @@ -69,28 +69,28 @@ public class IOUtil { public static final String JAR_SCHEME = "jar"; /** A JAR subprotocol is separeted from the JAR entry w/ this separator {@value}. Even if no class is specified '!/' must follow!. */ public static final String JAR_SCHEME_SEPARATOR = "!"; - + /** Std. temporary directory property key <code>java.io.tmpdir</code>. */ - private static final String java_io_tmpdir_propkey = "java.io.tmpdir"; + private static final String java_io_tmpdir_propkey = "java.io.tmpdir"; private static final String user_home_propkey = "user.home"; private static final String XDG_CACHE_HOME_envkey = "XDG_CACHE_HOME"; - /** Subdirectory within platform's temporary root directory where all JogAmp related temp files are being stored: {@code jogamp} */ + /** Subdirectory within platform's temporary root directory where all JogAmp related temp files are being stored: {@code jogamp} */ public static final String tmpSubDir = "jogamp"; - + private IOUtil() {} - - /** + + /** * Since usage of {@link java.io.FileOutputStream} is considered security critical, * we need to check it's availability for each use. * <p> * In case a SecurityManager is installed, privileged access is required. * </p> - * - * @return the constructor of {@link java.io.FileOutputStream} if available and - * no SecurityManager is installed or privileged access is granted. + * + * @return the constructor of {@link java.io.FileOutputStream} if available and + * no SecurityManager is installed or privileged access is granted. * Otherwise null. - * + * */ private static final Constructor<?> getFOSCtor() { Constructor<?> _fosCtor; @@ -102,7 +102,7 @@ public class IOUtil { _fosCtor = null; _t = t; } - if(DEBUG) { + if(DEBUG) { System.err.println("IOUtil: java.io.FileOutputStream available: "+(null != _fosCtor)); if(null!=_t) { _t.printStackTrace(); @@ -110,24 +110,24 @@ public class IOUtil { } return _fosCtor; } - + /*** - * + * * STREAM COPY STUFF - * + * */ - + /** * Copy the specified URL resource to the specified output file. The total * number of bytes written is returned. Both streams are closed upon completion. - * - * @param conn the open URLConnection + * + * @param conn the open URLConnection * @param outFile the destination * @return * @throws IOException */ public static int copyURLConn2File(URLConnection conn, File outFile) throws IOException { - conn.connect(); // redundant + conn.connect(); // redundant int totalNumBytes = 0; InputStream in = new BufferedInputStream(conn.getInputStream()); @@ -142,10 +142,10 @@ public class IOUtil { /** * Copy the specified input stream to the specified output file. The total * number of bytes written is returned. Both streams are closed upon completion. - * - * @param in the source + * + * @param in the source * @param outFile the destination - * @param totalNumBytes informal number of expected bytes, maybe used for user feedback while processing. -1 if unknown + * @param totalNumBytes informal number of expected bytes, maybe used for user feedback while processing. -1 if unknown * @return * @throws IOException */ @@ -162,10 +162,10 @@ public class IOUtil { /** * Copy the specified input stream to the specified output stream. The total * number of bytes written is returned. - * - * @param in the source + * + * @param in the source * @param out the destination - * @param totalNumBytes informal number of expected bytes, maybe used for user feedback while processing. -1 if unknown + * @param totalNumBytes informal number of expected bytes, maybe used for user feedback while processing. -1 if unknown * @return * @throws IOException */ @@ -176,11 +176,11 @@ public class IOUtil { /** * Copy the specified input stream to the specified output stream. The total * number of bytes written is returned. - * + * * @param bufferSize the intermediate buffer size, should be {@link MachineDescription#pageSizeInBytes()} for best performance. - * @param in the source + * @param in the source * @param out the destination - * @param totalNumBytes informal number of expected bytes, maybe used for user feedback while processing. -1 if unknown + * @param totalNumBytes informal number of expected bytes, maybe used for user feedback while processing. -1 if unknown * @return * @throws IOException */ @@ -197,7 +197,7 @@ public class IOUtil { } return numBytes; } - + /** * Copy the specified input stream to a byte array, which is being returned. */ @@ -235,17 +235,17 @@ public class IOUtil { /** * Copy the specified input stream to a NIO ByteBuffer w/ native byte order, which is being returned. * <p>The implementation creates the ByteBuffer w/ {@link #copyStream2ByteArray(InputStream)}'s returned byte array.</p> - * + * * @param stream input stream, which will be wrapped into a BufferedInputStream, if not already done. */ public static ByteBuffer copyStream2ByteBuffer(InputStream stream) throws IOException { - return copyStream2ByteBuffer(stream, -1); + return copyStream2ByteBuffer(stream, -1); } - + /** * Copy the specified input stream to a NIO ByteBuffer w/ native byte order, which is being returned. * <p>The implementation creates the ByteBuffer w/ {@link #copyStream2ByteArray(InputStream)}'s returned byte array.</p> - * + * * @param stream input stream, which will be wrapped into a BufferedInputStream, if not already done. * @param initialCapacity initial buffer capacity in bytes, if > available bytes */ @@ -257,7 +257,7 @@ public class IOUtil { if( initialCapacity < avail ) { initialCapacity = avail; } - final MachineDescription machine = Platform.getMachineDescription(); + final MachineDescription machine = Platform.getMachineDescription(); ByteBuffer data = Buffers.newDirectByteBuffer( machine.pageAlignedSize( initialCapacity ) ); byte[] chunk = new byte[machine.pageSizeInBytes()]; int chunk2Read = Math.min(machine.pageSizeInBytes(), avail); @@ -269,13 +269,13 @@ public class IOUtil { newData.put(data); data = newData; } - + numRead = stream.read(chunk, 0, chunk2Read); if (numRead > 0) { data.put(chunk, 0, numRead); } avail = stream.available(); - chunk2Read = Math.min(machine.pageSizeInBytes(), avail); + chunk2Read = Math.min(machine.pageSizeInBytes(), avail); } while ( numRead > 0 ); // EOS: -1 == numRead, EOF maybe reached earlier w/ 0 == numRead data.flip(); @@ -283,13 +283,13 @@ public class IOUtil { } /*** - * + * * RESOURCE / FILE NAME STUFF - * + * */ - + /** - * + * * @param path * @param startWithSlash * @param endWithSlash @@ -297,7 +297,7 @@ public class IOUtil { * @throws URISyntaxException if path is empty or has no parent directory available while resolving <code>../</code> */ public static String slashify(String path, boolean startWithSlash, boolean endWithSlash) throws URISyntaxException { - String p = path.replace('\\', '/'); // unify file separator + String p = path.replace('\\', '/'); // unify file separator if (startWithSlash && !p.startsWith("/")) { p = "/" + p; } @@ -306,23 +306,23 @@ public class IOUtil { } return cleanPathString(p); } - - /** - * Using the simple conversion via File -> URI, assuming proper characters. + + /** + * Using the simple conversion via File -> URI, assuming proper characters. * @throws URISyntaxException if path is empty or has no parent directory available while resolving <code>../</code> - * @throws URISyntaxException if the resulting string does not comply w/ an RFC 2396 URI + * @throws URISyntaxException if the resulting string does not comply w/ an RFC 2396 URI */ public static URI toURISimple(File file) throws URISyntaxException { - return new URI(FILE_SCHEME, null, encodeToURI(slashify(file.getAbsolutePath(), true, file.isDirectory())), null); + return new URI(FILE_SCHEME, null, encodeToURI(slashify(file.getAbsolutePath(), true, file.isDirectory())), null); } - - /** - * Using the simple conversion via File -> URI, assuming proper characters. + + /** + * Using the simple conversion via File -> URI, assuming proper characters. * @throws URISyntaxException if path is empty or has no parent directory available while resolving <code>../</code> - * @throws URISyntaxException if the resulting string does not comply w/ an RFC 2396 URI + * @throws URISyntaxException if the resulting string does not comply w/ an RFC 2396 URI */ public static URI toURISimple(String protocol, String file, boolean isDirectory) throws URISyntaxException { - return new URI(protocol, null, encodeToURI(slashify(file, true, isDirectory)), null); + return new URI(protocol, null, encodeToURI(slashify(file, true, isDirectory)), null); } /** @@ -364,14 +364,14 @@ public class IOUtil { return arg.toLowerCase(); } - + /*** * @param file * @param allowOverwrite * @return outputStream The resulting output stream - * @throws IOException if the file already exists and <code>allowOverwrite</code> is false, + * @throws IOException if the file already exists and <code>allowOverwrite</code> is false, * the class {@link java.io.FileOutputStream} is not accessible or - * the user does not have sufficient rights to access the local filesystem. + * the user does not have sufficient rights to access the local filesystem. */ public static FileOutputStream getFileOutputStream(File file, boolean allowOverwrite) throws IOException { final Constructor<?> fosCtor = getFOSCtor(); @@ -387,14 +387,14 @@ public class IOUtil { throw new IOException("error opening " + file + " for write. ", e); } } - + public static String getClassFileName(String clazzBinName) { - // or return clazzBinName.replace('.', File.separatorChar) + ".class"; ? - return clazzBinName.replace('.', '/') + ".class"; + // or return clazzBinName.replace('.', File.separatorChar) + ".class"; ? + return clazzBinName.replace('.', '/') + ".class"; } - + /** - * @param clazzBinName com.jogamp.common.util.cache.TempJarCache + * @param clazzBinName com.jogamp.common.util.cache.TempJarCache * @param cl ClassLoader to locate the JarFile * @return jar:file:/usr/local/projects/JOGL/gluegen/build-x86_64/gluegen-rt.jar!/com/jogamp/common/util/cache/TempJarCache.class * @throws IOException if the jar file could not been found by the ClassLoader @@ -406,7 +406,7 @@ public class IOUtil { } return url; } - + /** * Returns the basename of the given fname w/o directory part * @throws URISyntaxException if path is empty or has no parent directory available while resolving <code>../</code> @@ -419,7 +419,7 @@ public class IOUtil { } return fname; } - + /** * Returns unified '/' dirname including the last '/' * @throws URISyntaxException if path is empty or has no parent directory available while resolving <code>../</code> @@ -432,22 +432,22 @@ public class IOUtil { } return fname; } - + /** * The URI's <code><i>protocol</i>:/some/path/gluegen-rt.jar</code> * parent dirname URI <code><i>protocol</i>:/some/path/</code> will be returned. * <p> * <i>protocol</i> may be "file", "http", etc.. * </p> - * + * * @param uri "<i>protocol</i>:/some/path/gluegen-rt.jar" * @return "<i>protocol</i>:/some/path/" * @throws IllegalArgumentException if the URI doesn't match the expected formatting, or is null - * @throws URISyntaxException + * @throws URISyntaxException */ public static URI getURIDirname(URI uri) throws IllegalArgumentException, URISyntaxException { if(null == uri) { - throw new IllegalArgumentException("URI is null"); + throw new IllegalArgumentException("URI is null"); } String uriS = uri.toString(); if( DEBUG ) { @@ -455,24 +455,24 @@ public class IOUtil { } return new URI( getURIDirname(uriS) ); } - + /** * The URI's <code><i>protocol</i>:/some/path/gluegen-rt.jar</code> * parent dirname URI <code><i>protocol</i>:/some/path/</code> will be returned. * <p> * <i>protocol</i> may be "file", "http", etc.. * </p> - * + * * @param uri "<i>protocol</i>:/some/path/gluegen-rt.jar" (URI encoded) * @return "<i>protocol</i>:/some/path/" * @throws IllegalArgumentException if the URI doesn't match the expected formatting, or is null - * @throws URISyntaxException + * @throws URISyntaxException */ public static String getURIDirname(String uriS) throws IllegalArgumentException, URISyntaxException { if(null == uriS) { - throw new IllegalArgumentException("uriS is null"); + throw new IllegalArgumentException("uriS is null"); } - // from + // from // file:/some/path/gluegen-rt.jar _or_ rsrc:gluegen-rt.jar // to // file:/some/path/ _or_ rsrc: @@ -484,15 +484,15 @@ public class IOUtil { throw new IllegalArgumentException("URI does not contain protocol terminator ':', in <"+uriS+">"); } } - uriS = uriS.substring(0, idx+1); // exclude jar name, include terminal '/' or ':' - + uriS = uriS.substring(0, idx+1); // exclude jar name, include terminal '/' or ':' + if( DEBUG ) { System.out.println("getJarURIDirname res: "+uriS); - } + } return uriS; } - - /** + + /** * Converts an {@link URI} to an {@link URL} while using a non encoded path * for <i>file scheme</i>, i.e. <code>file:/</code>. * Otherwise the default {@link URL} translation {@link URI#toURL()} is being used. @@ -551,18 +551,18 @@ public class IOUtil { } return url; } - + /*** - * + * * RESOURCE LOCATION STUFF - * + * */ - + /** * Locating a resource using {@link #getResource(String, ClassLoader)}: * <ul> - * <li><i>relative</i>: <code>context</code>'s package name-path plus <code>resourcePath</code> via <code>context</code>'s ClassLoader. - * This allows locations relative to JAR- and other URLs. + * <li><i>relative</i>: <code>context</code>'s package name-path plus <code>resourcePath</code> via <code>context</code>'s ClassLoader. + * This allows locations relative to JAR- and other URLs. * The <code>resourcePath</code> may start with <code>../</code> to navigate to parent folder.</li> * <li><i>absolute</i>: <code>context</code>'s ClassLoader and the <code>resourcePath</code> as is (filesystem)</li> * </ul> @@ -570,7 +570,7 @@ public class IOUtil { * <p> * Returns the resolved and open URLConnection or null if not found. * </p> - * + * * @see #getResource(String, ClassLoader) * @see ClassLoader#getResource(String) * @see ClassLoader#getSystemResource(String) @@ -578,11 +578,11 @@ public class IOUtil { public static URLConnection getResource(Class<?> context, String resourcePath) { if(null == resourcePath) { return null; - } + } ClassLoader contextCL = (null!=context)?context.getClassLoader():IOUtil.class.getClassLoader(); URLConnection conn = null; if(null != context) { - // scoping the path within the class's package + // scoping the path within the class's package final String className = context.getName().replace('.', '/'); final int lastSlash = className.lastIndexOf('/'); if (lastSlash >= 0) { @@ -647,7 +647,7 @@ public class IOUtil { /** * Generates a path for the 'relativeFile' relative to the 'baseLocation'. - * + * * @param baseLocation denotes a directory * @param relativeFile denotes a relative file to the baseLocation * @throws URISyntaxException if path is empty or has no parent directory available while resolving <code>../</code> @@ -656,7 +656,7 @@ public class IOUtil { if(null == relativeFile) { return null; } - + if (baseLocation != null) { final File file = new File(baseLocation, relativeFile); // Handle things on Windows @@ -668,14 +668,14 @@ public class IOUtil { /** * @param path assuming a slashified path beginning with "/" as it's root directory, either denotes a file or directory. * @return parent of path - * @throws URISyntaxException if path is empty or has no parent directory available + * @throws URISyntaxException if path is empty or has no parent directory available */ public static String getParentOf(String path) throws URISyntaxException { final int pl = null!=path ? path.length() : 0; if(pl == 0) { throw new IllegalArgumentException("path is empty <"+path+">"); } - + final int e = path.lastIndexOf("/"); if( e < 0 ) { throw new URISyntaxException(path, "path contains no '/'"); @@ -688,7 +688,7 @@ public class IOUtil { // path is file, return it's parent directory return path.substring(0, e+1); } - final int j = path.lastIndexOf("!") + 1; // '!' Separates JARFile entry -> local start of path + final int j = path.lastIndexOf("!") + 1; // '!' Separates JARFile entry -> local start of path // path is a directory .. final int p = path.lastIndexOf("/", e-1); if( p >= j) { @@ -696,10 +696,10 @@ public class IOUtil { } throw new URISyntaxException(path, "parent of path contains no '/'"); } - + /** * @param path assuming a slashified path beginning with "/" as it's root directory, either denotes a file or directory. - * @return clean path string where <code>../</code> and <code>./</code> is resolved. + * @return clean path string where <code>../</code> and <code>./</code> is resolved. * @throws URISyntaxException if path is empty or has no parent directory available while resolving <code>../</code> */ public static String cleanPathString(String path) throws URISyntaxException { @@ -712,47 +712,47 @@ public class IOUtil { } return path; } - + /** * Generates a URI for the <i>relativePath</i> relative to the <i>baseURI</i>, * hence the result is a absolute location. * <p> - * Impl. operates on the <i>scheme-specific-part</i>, and hence is sub-protocol savvy. + * Impl. operates on the <i>scheme-specific-part</i>, and hence is sub-protocol savvy. * </p> * <p> - * In case <i>baseURI</i> is not a path ending w/ '/', it's a assumed to be a file and it's parent is being used. + * In case <i>baseURI</i> is not a path ending w/ '/', it's a assumed to be a file and it's parent is being used. * </p> - * + * * @param baseURI denotes a URI to a directory ending w/ '/', or a file. In the latter case the file's directory is being used. * @param relativePath denotes a relative file to the baseLocation's parent directory * @throws URISyntaxException if path is empty or has no parent directory available while resolving <code>../</code> */ - public static URI getRelativeOf(URI baseURI, String relativePath) throws URISyntaxException { + public static URI getRelativeOf(URI baseURI, String relativePath) throws URISyntaxException { return compose(baseURI.getScheme(), baseURI.getSchemeSpecificPart(), encodeToURI(relativePath), baseURI.getFragment()); } - + /** * Wraps {@link #getRelativeOf(URI, String)} for convenience. * @throws IOException */ - public static URL getRelativeOf(URL baseURL, String relativePath) throws IOException { + public static URL getRelativeOf(URL baseURL, String relativePath) throws IOException { try { return getRelativeOf(baseURL.toURI(), relativePath).toURL(); } catch (URISyntaxException e) { throw new IOException(e); } } - + /** * Generates a URI for the <i>relativePath</i> relative to the <i>schemeSpecificPart</i>, * hence the result is a absolute location. * <p> - * <i>schemeSpecificPart</i>'s query, if exist is split to <i>path</i> and <i>query</i>. + * <i>schemeSpecificPart</i>'s query, if exist is split to <i>path</i> and <i>query</i>. * </p> * <p> - * In case <i>path</i> is not a path ending w/ '/', it's a assumed to be a file and it's parent is being used. + * In case <i>path</i> is not a path ending w/ '/', it's a assumed to be a file and it's parent is being used. * </p> - * + * * @param scheme scheme of the resulting URI * @param schemeSpecificPart may include a query, which is separated while processing (URI encoded) * @param relativePath denotes a relative file to the baseLocation's parent directory (URI encoded) @@ -778,12 +778,12 @@ public class IOUtil { } schemeSpecificPart = cleanPathString( schemeSpecificPart ); return new URI(scheme, null == query ? schemeSpecificPart : schemeSpecificPart + "?" + query, fragment); - } - + } + private static final Pattern patternSpaceRaw = Pattern.compile(" "); private static final Pattern patternSpaceEnc = Pattern.compile("%20"); - - /** + + /** * Escapes characters not complying w/ RFC 2396 and the {@link URI#URI(String)} ctor. * <ul> * <li>SPACE -> %20</li> @@ -792,21 +792,21 @@ public class IOUtil { public static String encodeToURI(String s) { return patternSpaceRaw.matcher(s).replaceAll("%20"); } - - /** + + /** * Reverses escaping of characters as performed via {@link #encodeToURI(String)}. */ public static String decodeFromURI(String s) { return patternSpaceEnc.matcher(s).replaceAll(" "); } - + /** * Returns the connected URLConnection, or null if not url is not available */ public static URLConnection openURL(URL url) { return openURL(url, "."); } - + /** * Returns the connected URLConnection, or null if not url is not available */ @@ -819,19 +819,19 @@ public class IOUtil { System.err.println("IOUtil: urlExists("+url+") ["+dbgmsg+"] - true"); } return c; - } catch (IOException ioe) { + } catch (IOException ioe) { if(DEBUG) { System.err.println("IOUtil: urlExists("+url+") ["+dbgmsg+"] - false - "+ioe.getClass().getSimpleName()+": "+ioe.getMessage()); ioe.printStackTrace(); - } + } } } else if(DEBUG) { System.err.println("IOUtil: no url - urlExists(null) ["+dbgmsg+"]"); - } - + } + return null; } - + private static String getShellSuffix() { switch(PlatformPropsImpl.OS_TYPE) { case WINDOWS: @@ -840,18 +840,18 @@ public class IOUtil { return ".sh"; } } - + private static boolean getOSHasNoexecFS() { switch(PlatformPropsImpl.OS_TYPE) { case WINDOWS: case OPENKODE: return false; - + default: return true; } } - + /** * @see <a href="http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html">Free-Desktop - XDG Base Directory Specification</a> */ @@ -862,26 +862,26 @@ public class IOUtil { case WINDOWS: case OPENKODE: return false; - + default: return true; } } - + /** * Test whether {@code file} exists and matches the given requirements - * + * * @param file * @param shallBeDir * @param shallBeWritable * @return */ - public static boolean testFile(File file, boolean shallBeDir, boolean shallBeWritable) { + public static boolean testFile(File file, boolean shallBeDir, boolean shallBeWritable) { if (!file.exists()) { if(DEBUG) { System.err.println("IOUtil.testFile: <"+file.getAbsolutePath()+">: does not exist"); } - return false; + return false; } if (shallBeDir && !file.isDirectory()) { if(DEBUG) { @@ -893,7 +893,7 @@ public class IOUtil { if(DEBUG) { System.err.println("IOUtil.testFile: <"+file.getAbsolutePath()+">: is not writable"); } - return false; + return false; } return true; } @@ -904,9 +904,9 @@ public class IOUtil { * <li>exists, and</li> * <li>is a directory, and</li> * <li>is writeable, and</li> - * <li>files can be executed from the directory</li> + * <li>files can be executed from the directory</li> * </ol> - * + * * @throws SecurityException if file creation and process execution is not allowed within the current security context * @param dir */ @@ -914,12 +914,12 @@ public class IOUtil { throws SecurityException { if (!testFile(dir, true, true)) { - return false; + return false; } if(!getOSHasNoexecFS()) { return true; } - + File exetst; try { exetst = File.createTempFile("jogamp_exe_tst", getShellSuffix(), dir); @@ -951,31 +951,31 @@ public class IOUtil { return 0 == ok; } - private static File testDirImpl(File dir, boolean create, boolean executable) + private static File testDirImpl(File dir, boolean create, boolean executable) throws SecurityException { if (create && !dir.exists()) { - dir.mkdirs(); + dir.mkdirs(); } if( executable ) { if(testDirExec(dir)) { return dir; } } else if(testFile(dir, true, true)) { - return dir; + return dir; } return null; } - + /** * Returns the directory {@code dir}, which is processed and tested as described below. * <ol> * <li>If {@code create} is {@code true} and the directory does not exist yet, it is created incl. all sub-directories.</li> * <li>If {@code dirName} exists, but is not a directory, {@code null} is being returned.</li> * <li>If the directory does not exist or is not writeable, {@code null} is being returned.</li> - * <li>If {@code executable} is {@code true} and files cannot be executed from the directory, {@code null} is being returned.</li> + * <li>If {@code executable} is {@code true} and files cannot be executed from the directory, {@code null} is being returned.</li> * </ol> - * + * * @param dir the directory to process * @param create true if the directory shall be created if not existing * @param executable true if the user intents to launch executables from the temporary directory, otherwise false. @@ -985,14 +985,14 @@ public class IOUtil { throws SecurityException { return testDirImpl(dir, create, executable); - } - - private static boolean isStringSet(String s) { return null != s && 0 < s.length(); } - + } + + private static boolean isStringSet(String s) { return null != s && 0 < s.length(); } + /** * This methods finds [and creates] an available temporary sub-directory: * <pre> - File tmpBaseDir = null; + File tmpBaseDir = null; if(null != testDir(tmpRoot, true, executable)) { // check tmpRoot first for(int i = 0; null == tmpBaseDir && i<=9999; i++) { final String tmpDirSuffix = String.format("_%04d", i); // 4 digits for iteration @@ -1015,7 +1015,7 @@ public class IOUtil { private static File getSubTempDir(File tmpRoot, String tmpSubDirPrefix, boolean executable) throws SecurityException { - File tmpBaseDir = null; + File tmpBaseDir = null; if(null != testDirImpl(tmpRoot, true /* create */, executable)) { // check tmpRoot first for(int i = 0; null == tmpBaseDir && i<=9999; i++) { final String tmpDirSuffix = String.format("_%04d", i); // 4 digits for iteration @@ -1024,16 +1024,16 @@ public class IOUtil { } return tmpBaseDir; } - + /** * Returns a platform independent writable directory for temporary files - * consisting of the platform's {@code temp-root} + {@link #tmpSubDir}, - * e.g. {@code /tmp/jogamp_0000/}. + * consisting of the platform's {@code temp-root} + {@link #tmpSubDir}, + * e.g. {@code /tmp/jogamp_0000/}. * <p> * On standard Java the {@code temp-root} folder is specified by <code>java.io.tempdir</code>. - * </p> + * </p> * <p> - * On Android the {@code temp-root} folder is relative to the applications local folder + * On Android the {@code temp-root} folder is relative to the applications local folder * (see {@link Context#getDir(String, int)}) is returned, if * the Android application/activity has registered it's Application Context * via {@link jogamp.common.os.android.StaticContext.StaticContext#init(Context, ClassLoader) StaticContext.init(..)}. @@ -1042,12 +1042,12 @@ public class IOUtil { * </p> * <p> * In case {@code temp-root} is the users home folder, - * a dot is being prepended to {@link #tmpSubDir}, i.e.: {@code /home/user/.jogamp_0000/}. + * a dot is being prepended to {@link #tmpSubDir}, i.e.: {@code /home/user/.jogamp_0000/}. * </p> * @param executable true if the user intents to launch executables from the temporary directory, otherwise false. * @throws RuntimeException if no temporary directory could be determined * @throws SecurityException if access to <code>java.io.tmpdir</code> is not allowed within the current security context - * + * * @see PropertyAccess#getProperty(String, boolean) * @see Context#getDir(String, int) */ @@ -1066,40 +1066,40 @@ public class IOUtil { return tempRootExec; } } - + final String java_io_tmpdir = PropertyAccess.getProperty(java_io_tmpdir_propkey, false); final String user_home = PropertyAccess.getProperty(user_home_propkey, false); - + final String xdg_cache_home; { String _xdg_cache_home; - if( getOSHasFreeDesktopXDG() ) { + if( getOSHasFreeDesktopXDG() ) { _xdg_cache_home = System.getenv(XDG_CACHE_HOME_envkey); if( !isStringSet(_xdg_cache_home) && isStringSet(user_home) ) { _xdg_cache_home = user_home + File.separator + ".cache" ; // default - } + } } else { _xdg_cache_home = null; } xdg_cache_home = _xdg_cache_home; } - + // 1) java.io.tmpdir/jogamp if( null == tempRootExec && isStringSet(java_io_tmpdir) ) { tempRootExec = getSubTempDir(new File(java_io_tmpdir), tmpSubDir, true /* executable */); } - + // 2) $XDG_CACHE_HOME/jogamp if(null == tempRootExec && isStringSet(xdg_cache_home)) { - tempRootExec = getSubTempDir(new File(xdg_cache_home), tmpSubDir, true /* executable */); + tempRootExec = getSubTempDir(new File(xdg_cache_home), tmpSubDir, true /* executable */); } - + // 3) $HOME/.jogamp - if(null == tempRootExec && isStringSet(user_home)) { + if(null == tempRootExec && isStringSet(user_home)) { tempRootExec = getSubTempDir(new File(user_home), "." + tmpSubDir, true /* executable */); - } - - + } + + if(null != tempRootExec) { tempRootNoexec = tempRootExec; } else { @@ -1107,18 +1107,18 @@ public class IOUtil { if( null == tempRootNoexec && isStringSet(java_io_tmpdir) ) { tempRootNoexec = getSubTempDir(new File(java_io_tmpdir), tmpSubDir, false /* executable */); } - + // 2) $XDG_CACHE_HOME/jogamp if(null == tempRootNoexec && isStringSet(xdg_cache_home)) { - tempRootNoexec = getSubTempDir(new File(xdg_cache_home), tmpSubDir, false /* executable */); + tempRootNoexec = getSubTempDir(new File(xdg_cache_home), tmpSubDir, false /* executable */); } - + // 3) $HOME/.jogamp - if(null == tempRootNoexec && isStringSet(user_home)) { + if(null == tempRootNoexec && isStringSet(user_home)) { tempRootNoexec = getSubTempDir(new File(user_home), "." + tmpSubDir, false /* executable */); - } + } } - + if(DEBUG) { System.err.println("IOUtil.getTempRoot(): temp dirs: exec: "+tempRootExec.getAbsolutePath()+", noexec: "+tempRootNoexec.getAbsolutePath()); } @@ -1136,16 +1136,16 @@ public class IOUtil { private static File tempRootExec = null; // writeable and executable private static File tempRootNoexec = null; // writeable, maybe executable private static volatile boolean tempRootSet = false; - + /** * Utilizing {@link File#createTempFile(String, String, File)} using - * {@link #getTempDir(boolean)} as the directory parameter, ie. location + * {@link #getTempDir(boolean)} as the directory parameter, ie. location * of the root temp folder. - * + * * @see File#createTempFile(String, String) * @see File#createTempFile(String, String, File) * @see #getTempDir(boolean) - * + * * @param prefix * @param suffix * @param executable true if the temporary root folder needs to hold executable files, otherwise false. @@ -1154,9 +1154,9 @@ public class IOUtil { * @throws IOException * @throws SecurityException */ - public static File createTempFile(String prefix, String suffix, boolean executable) - throws IllegalArgumentException, IOException, SecurityException - { + public static File createTempFile(String prefix, String suffix, boolean executable) + throws IllegalArgumentException, IOException, SecurityException + { return File.createTempFile( prefix, suffix, getTempDir(executable) ); } @@ -1172,6 +1172,6 @@ public class IOUtil { e.printStackTrace(); } } - } + } } } diff --git a/src/java/com/jogamp/common/util/IntBitfield.java b/src/java/com/jogamp/common/util/IntBitfield.java index ad27dff..07b24dc 100644 --- a/src/java/com/jogamp/common/util/IntBitfield.java +++ b/src/java/com/jogamp/common/util/IntBitfield.java @@ -29,24 +29,24 @@ package com.jogamp.common.util; /** * Simple bitfield holder class using an int[] storage. - * <p> + * <p> * IntBitfield allows convenient access of a wide field of transient bits using efficient storage in O(1). * </p> * <p> * It can be used e.g. to map key-codes to pressed-state etc. - * </p> + * </p> */ public class IntBitfield { /** Unit size in bits, here 32 bits for one int unit. */ public static final int UNIT_SIZE = 32; - + private static final long UNIT_SHIFT_L = 5L; private static final int UNIT_SHIFT_I = 5; - + private final int[] storage; private final long bitsCountL; private final int bitsCountI; - + /** * @param bitCount */ @@ -54,9 +54,9 @@ public class IntBitfield { final int units = (int) ( ( bitCount + 7L ) >> UNIT_SHIFT_L ); this.storage = new int[units]; this.bitsCountL = (long)units << UNIT_SHIFT_L ; - this.bitsCountI = bitsCountL > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)bitsCountL; + this.bitsCountI = bitsCountL > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)bitsCountL; } - + /** * @param bitCount */ @@ -66,7 +66,7 @@ public class IntBitfield { this.bitsCountI = units << UNIT_SHIFT_I; this.bitsCountL = bitsCountI; } - + private final void check(long bitnum) { if( 0 > bitnum || bitnum >= bitsCountL ) { throw new ArrayIndexOutOfBoundsException("Bitnum should be within [0.."+(bitsCountL-1)+"], but is "+bitnum); @@ -77,10 +77,10 @@ public class IntBitfield { throw new ArrayIndexOutOfBoundsException("Bitnum should be within [0.."+(bitsCountI-1)+"], but is "+bitnum); } } - + /** Return the capacity of this bit field, i.e. the number of bits stored int this field. */ public final long capacity() { return bitsCountL; } - + /** Return <code>true</code> if the bit at position <code>bitnum</code> is set, otherwise <code>false</code>. */ public final boolean get(long bitnum) { check(bitnum); @@ -88,7 +88,7 @@ public class IntBitfield { final int b = (int) ( bitnum - ( (long)u << UNIT_SHIFT_L ) ); return 0 != ( storage[u] & ( 1 << b ) ) ; } - + /** Return <code>true</code> if the bit at position <code>bitnum</code> is set, otherwise <code>false</code>. */ public final boolean get(int bitnum) { check(bitnum); @@ -96,12 +96,12 @@ public class IntBitfield { final int b = bitnum - ( u << UNIT_SHIFT_I ); return 0 != ( storage[u] & ( 1 << b ) ) ; } - - /** + + /** * Set or clear the bit at position <code>bitnum</code> according to <code>bit</code> - * and return the previous value. + * and return the previous value. */ - public final boolean put(long bitnum, boolean bit) { + public final boolean put(long bitnum, boolean bit) { check(bitnum); final int u = (int) ( bitnum >> UNIT_SHIFT_L ); final int b = (int) ( bitnum - ( (long)u << UNIT_SHIFT_L ) ); @@ -116,12 +116,12 @@ public class IntBitfield { } return prev; } - - /** + + /** * Set or clear the bit at position <code>bitnum</code> according to <code>bit</code> - * and return the previous value. + * and return the previous value. */ - public final boolean put(int bitnum, boolean bit) { + public final boolean put(int bitnum, boolean bit) { check(bitnum); final int u = bitnum >> UNIT_SHIFT_I; final int b = bitnum - ( u << UNIT_SHIFT_I ); @@ -151,8 +151,8 @@ public class IntBitfield { c -= (n >> 2) & 011111111111; return ( (c + ( c >> 3 ) ) & 030707070707 ) % 63; } - - /** + + /** * Returns the number of set bits within this bitfield. */ public long getBitCount() { diff --git a/src/java/com/jogamp/common/util/IntIntHashMap.java b/src/java/com/jogamp/common/util/IntIntHashMap.java index 7909478..06b9a3f 100644 --- a/src/java/com/jogamp/common/util/IntIntHashMap.java +++ b/src/java/com/jogamp/common/util/IntIntHashMap.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,12 +20,12 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ - + /** * Created on Sunday, March 28 2010 21:01 */ @@ -52,14 +52,14 @@ import java.util.Iterator; * @author Michael Bien * @author Simon Goller * @author Sven Gothel - * + * * @see IntObjectHashMap * @see IntLongHashMap * @see LongObjectHashMap * @see LongLongHashMap * @see LongIntHashMap */ -public class /*name*/IntIntHashMap/*name*/ implements Cloneable, +public class /*name*/IntIntHashMap/*name*/ implements Cloneable, Iterable< /*name*/IntIntHashMap/*name*/.Entry > { private final float loadFactor; @@ -70,34 +70,34 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, private int capacity; private int threshold; private /*value*/int/*value*/ keyNotFoundValue = /*null*/-1/*null*/; - + private static final boolean isPrimitive; private static final Constructor</*name*/IntIntHashMap/*name*/.Entry> entryConstructor; private static final Method equalsMethod; - + static class EntryCM { EntryCM() { c = null; m1 = null; } Constructor<Entry> c; Method m1; }; - + static { final Class<?> valueClazz = /*value*/int/*value*/.class; final Class<?> keyClazz = /*key*/int/*key*/.class; - + isPrimitive = valueClazz.isPrimitive(); - + if(!isPrimitive) { final EntryCM cm = AccessController.doPrivileged(new PrivilegedAction<EntryCM>() { @SuppressWarnings("unchecked") public EntryCM run() { EntryCM r = new EntryCM(); - r.c = (Constructor<Entry>) - ReflectionUtil.getConstructor(Entry.class, + r.c = (Constructor<Entry>) + ReflectionUtil.getConstructor(Entry.class, new Class[] { keyClazz, valueClazz, Entry.class } ); try { r.m1 = valueClazz.getDeclaredMethod("equals", Object.class); - } catch (NoSuchMethodException ex) { + } catch (NoSuchMethodException ex) { throw new JogampRuntimeException("Class "+valueClazz+" doesn't support equals(Object)"); } - return r; - } } ); + return r; + } } ); entryConstructor = cm.c; equalsMethod = cm.m1; } else { @@ -105,7 +105,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, equalsMethod = null; } } - + public /*name*/IntIntHashMap/*name*/() { this(16, 0.75f); } @@ -135,32 +135,32 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, } private /*name*/IntIntHashMap/*name*/(float loadFactor, int table_size, int size, - int mask, int capacity, int threshold, + int mask, int capacity, int threshold, /*value*/int/*value*/ keyNotFoundValue) { this.loadFactor = loadFactor; this.table = new Entry[table_size]; this.size = size; - + this.mask = mask; this.capacity = capacity; this.threshold = threshold; - - this.keyNotFoundValue = keyNotFoundValue; + + this.keyNotFoundValue = keyNotFoundValue; } - + /** * Disclaimer: If the value type doesn't implement {@link Object#clone() clone()}, only the reference is copied. * Note: Due to private fields we cannot implement a copy constructor, sorry. - * + * * @param source the primitive hash map to copy */ @Override public Object clone() { - /*name*/IntIntHashMap/*name*/ n = - new /*name*/IntIntHashMap/*name*/(loadFactor, table.length, size, - mask, capacity, threshold, + /*name*/IntIntHashMap/*name*/ n = + new /*name*/IntIntHashMap/*name*/(loadFactor, table.length, size, + mask, capacity, threshold, keyNotFoundValue); - + for(int i=table.length-1; i>=0; i--) { // single linked list -> ArrayList final ArrayList<Entry> entries = new ArrayList<Entry>(); @@ -182,10 +182,10 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, } // 1st elem of linked list is table entry n.table[i] = de_next; - } + } return n; } - + public boolean containsValue(/*value*/int/*value*/ value) { Entry[] t = this.table; for (int i = t.length; i-- > 0;) { @@ -196,9 +196,9 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, } } else { final Boolean b = (Boolean) ReflectionUtil.callMethod(value, equalsMethod, e.value); - if(b.booleanValue()) { + if(b.booleanValue()) { return true; - } + } } } } @@ -299,7 +299,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, final int index = /*keyHash*/key/*keyHash*/ & mask; Entry prev = t[index]; Entry e = prev; - + while (e != null) { Entry next = e.next; if (e.key == key) { @@ -355,7 +355,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, * * @return the previous key not found value * @see #get - * @see #put + * @see #put */ public /*value*/int/*value*/ setKeyNotFoundValue(/*value*/int/*value*/ newKeyNotFoundValue) { /*value*/int/*value*/ t = keyNotFoundValue; @@ -391,19 +391,19 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, sb.append("}"); return sb; } - + @Override public String toString() { return toString(null).toString(); } - + private final static class EntryIterator implements Iterator<Entry> { private final Entry[] entries; - + private int index; private Entry next; - + private EntryIterator(Entry[] entries){ this.entries = entries; // load next @@ -439,9 +439,9 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, public void remove() { throw new UnsupportedOperationException("Not supported yet."); } - + } - + /** * An entry mapping a key to a value. */ @@ -449,7 +449,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, public final /*key*/int/*key*/ key; public /*value*/int/*value*/ value; - + private Entry next; Entry(/*key*/int/*key*/ k, /*value*/int/*value*/ v, Entry n) { @@ -457,7 +457,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, value = v; next = n; } - + /** * Returns the key of this entry. */ @@ -490,21 +490,21 @@ public class /*name*/IntIntHashMap/*name*/ implements Cloneable, sb.append("[").append(key).append(":").append(value).append("]"); return sb; } - + @Override public String toString() { return toString(null).toString(); } } - + private static Method getCloneMethod(Object obj) { final Class<?> clazz = obj.getClass(); return AccessController.doPrivileged(new PrivilegedAction<Method>() { public Method run() { try { return clazz.getDeclaredMethod("clone"); - } catch (NoSuchMethodException ex) { + } catch (NoSuchMethodException ex) { throw new JogampRuntimeException("Class "+clazz+" doesn't support clone()", ex); } } } ); diff --git a/src/java/com/jogamp/common/util/JarUtil.java b/src/java/com/jogamp/common/util/JarUtil.java index 29e7dc7..1689d54 100644 --- a/src/java/com/jogamp/common/util/JarUtil.java +++ b/src/java/com/jogamp/common/util/JarUtil.java @@ -54,17 +54,17 @@ public class JarUtil { private static final boolean DEBUG = Debug.debug("JarUtil"); private static final int BUFFER_SIZE = 4096; - + /** * Interface allowing users to provide an URL resolver that will convert custom classloader * URLs like Eclipse/OSGi <i>bundleresource:</i> URLs to normal <i>jar:</i> URLs. - * <p> + * <p> * This might be required for custom classloader where the URI protocol is unknown - * to the standard runtime environment. + * to the standard runtime environment. * </p> * <p> * Note: The provided resolver is only utilized if a given URI's protocol could not be resolved. - * I.e. it will not be invoked for known protocols like <i>http</i>, <i>https</i>, <i>jar</i> or <i>file</i>. + * I.e. it will not be invoked for known protocols like <i>http</i>, <i>https</i>, <i>jar</i> or <i>file</i>. * </p> */ public interface Resolver { @@ -72,15 +72,15 @@ public class JarUtil { } private static Resolver resolver; - + /** * Setting a custom {@link Resolver} instance. - * + * * @param r {@link Resolver} to use after querying class file URLs from the classloader. * @throws IllegalArgumentException if the passed resolver is <code>null</code> * @throws IllegalStateException if the resolver has already been set. * @throws SecurityException if the security manager doesn't have the setFactory - * permission + * permission */ public static void setResolver(Resolver r) throws IllegalArgumentException, IllegalStateException, SecurityException { if(r == null) { @@ -101,13 +101,13 @@ public class JarUtil { /** * Returns <code>true</code> if the Class's <code>"com.jogamp.common.GlueGenVersion"</code> - * is loaded from a JarFile and hence has a Jar URI like + * is loaded from a JarFile and hence has a Jar URI like * URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class"</code>. * <p> * <i>sub_protocol</i> may be "file", "http", etc.. * </p> - * - * @param clazzBinName "com.jogamp.common.GlueGenVersion" + * + * @param clazzBinName "com.jogamp.common.GlueGenVersion" * @param cl * @return true if the class is loaded from a Jar file, otherwise false. * @see {@link #getJarURI(String, ClassLoader)} @@ -118,20 +118,20 @@ public class JarUtil { } catch (Exception e) { /* ignore */ } return false; } - + /** - * The Class's <code>"com.jogamp.common.GlueGenVersion"</code> + * The Class's <code>"com.jogamp.common.GlueGenVersion"</code> * URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class"</code> * will be returned. * <p> * <i>sub_protocol</i> may be "file", "http", etc.. * </p> - * - * @param clazzBinName "com.jogamp.common.GlueGenVersion" + * + * @param clazzBinName "com.jogamp.common.GlueGenVersion" * @param cl ClassLoader to locate the JarFile * @return "jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class" * @throws IllegalArgumentException if the URI doesn't match the expected formatting or null arguments - * @throws IOException if the class's Jar file could not been found by the ClassLoader + * @throws IOException if the class's Jar file could not been found by the ClassLoader * @throws URISyntaxException if the URI could not be translated into a RFC 2396 URI * @see {@link IOUtil#getClassURL(String, ClassLoader)} */ @@ -148,7 +148,7 @@ public class JarUtil { !scheme.equals( IOUtil.JAR_SCHEME ) && !scheme.equals( IOUtil.FILE_SCHEME ) && !scheme.equals( IOUtil.HTTP_SCHEME ) && - !scheme.equals( IOUtil.HTTPS_SCHEME ) ) + !scheme.equals( IOUtil.HTTPS_SCHEME ) ) { final URL _url = resolver.resolve( url ); uri = _url.toURI(); @@ -171,19 +171,19 @@ public class JarUtil { } return uri; } - - + + /** * The Class's Jar URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class</code> * Jar basename <code>gluegen-rt.jar</code> will be returned. * <p> * <i>sub_protocol</i> may be "file", "http", etc.. * </p> - * - * @param classJarURI as retrieved w/ {@link #getJarURI(String, ClassLoader) getJarURI("com.jogamp.common.GlueGenVersion", cl).toURI()}, + * + * @param classJarURI as retrieved w/ {@link #getJarURI(String, ClassLoader) getJarURI("com.jogamp.common.GlueGenVersion", cl).toURI()}, * i.e. <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class</code> * @return <code>gluegen-rt.jar</code> - * @throws IllegalArgumentException if the URI doesn't match the expected formatting or is null + * @throws IllegalArgumentException if the URI doesn't match the expected formatting or is null * @see {@link IOUtil#getClassURL(String, ClassLoader)} */ public static String getJarBasename(URI classJarURI) throws IllegalArgumentException { @@ -194,19 +194,19 @@ public class JarUtil { throw new IllegalArgumentException("URI is not using scheme "+IOUtil.JAR_SCHEME+": <"+classJarURI+">"); } String uriS = classJarURI.getSchemeSpecificPart(); - - // from + + // from // file:/some/path/gluegen-rt.jar!/com/jogamp/common/util/cache/TempJarCache.class // to // file:/some/path/gluegen-rt.jar int idx = uriS.lastIndexOf('!'); if (0 <= idx) { - uriS = uriS.substring(0, idx); // exclude '!/' + uriS = uriS.substring(0, idx); // exclude '!/' } else { throw new IllegalArgumentException("JAR URI does not contain jar uri terminator '!', in <"+classJarURI+">"); } - - // from + + // from // file:/some/path/gluegen-rt.jar // to // gluegen-rt.jar @@ -219,10 +219,10 @@ public class JarUtil { } } uriS = uriS.substring(idx+1); // just the jar name - + if(0 >= uriS.lastIndexOf(".jar")) { throw new IllegalArgumentException("No Jar name in <"+classJarURI+">"); - } + } if(DEBUG) { System.out.println("getJarName res: "+uriS); } @@ -230,17 +230,17 @@ public class JarUtil { } /** - * The Class's <code>com.jogamp.common.GlueGenVersion</code> + * The Class's <code>com.jogamp.common.GlueGenVersion</code> * URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class</code> * Jar basename <code>gluegen-rt.jar</code> will be returned. * <p> * <i>sub_protocol</i> may be "file", "http", etc.. * </p> - * + * * @param clazzBinName <code>com.jogamp.common.GlueGenVersion</code> * @param cl * @return <code>gluegen-rt.jar</code> - * @throws IllegalArgumentException if the URI doesn't match the expected formatting + * @throws IllegalArgumentException if the URI doesn't match the expected formatting * @throws IOException if the class's Jar file could not been found by the ClassLoader. * @throws URISyntaxException if the URI could not be translated into a RFC 2396 URI * @see {@link IOUtil#getClassURL(String, ClassLoader)} @@ -248,34 +248,34 @@ public class JarUtil { public static String getJarBasename(String clazzBinName, ClassLoader cl) throws IllegalArgumentException, IOException, URISyntaxException { return getJarBasename( getJarURI(clazzBinName, cl) ); } - + /** * The Class's Jar URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class</code> * Jar file's sub URI <code><i>sub_protocol</i>:/some/path/gluegen-rt.jar</code> will be returned. * <p> * <i>sub_protocol</i> may be "file", "http", etc.. * </p> - * - * @param classJarURI as retrieved w/ {@link #getJarURI(String, ClassLoader) getJarURI("com.jogamp.common.GlueGenVersion", cl).toURI()}, + * + * @param classJarURI as retrieved w/ {@link #getJarURI(String, ClassLoader) getJarURI("com.jogamp.common.GlueGenVersion", cl).toURI()}, * i.e. <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class</code> * @return <code><i>sub_protocol</i>:/some/path/gluegen-rt.jar</code> - * @throws IllegalArgumentException if the URI doesn't match the expected formatting or is null + * @throws IllegalArgumentException if the URI doesn't match the expected formatting or is null * @throws URISyntaxException if the URI could not be translated into a RFC 2396 URI * @see {@link IOUtil#getClassURL(String, ClassLoader)} */ public static URI getJarSubURI(URI classJarURI) throws IllegalArgumentException, URISyntaxException { if(null == classJarURI) { - throw new IllegalArgumentException("URI is null"); + throw new IllegalArgumentException("URI is null"); } if( !classJarURI.getScheme().equals(IOUtil.JAR_SCHEME) ) { throw new IllegalArgumentException("URI is not a using scheme "+IOUtil.JAR_SCHEME+": <"+classJarURI+">"); } - - // from + + // from // file:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class // to // file:/some/path/gluegen-rt.jar - final String uriS0 = classJarURI.getSchemeSpecificPart(); + final String uriS0 = classJarURI.getSchemeSpecificPart(); int idx = uriS0.lastIndexOf('!'); final String uriS1; if (0 <= idx) { @@ -292,26 +292,26 @@ public class JarUtil { } return new URI(uriS2); } - + /** * The Class's Jar URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class</code> * Jar file's entry <code>/com/jogamp/common/GlueGenVersion.class</code> will be returned. - * - * @param classJarURI as retrieved w/ {@link #getJarURI(String, ClassLoader) getJarURI("com.jogamp.common.GlueGenVersion", cl).toURI()}, + * + * @param classJarURI as retrieved w/ {@link #getJarURI(String, ClassLoader) getJarURI("com.jogamp.common.GlueGenVersion", cl).toURI()}, * i.e. <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class</code> * @return <code>/com/jogamp/common/GlueGenVersion.class</code> * @see {@link IOUtil#getClassURL(String, ClassLoader)} */ public static String getJarEntry(URI classJarURI) { if(null == classJarURI) { - throw new IllegalArgumentException("URI is null"); + throw new IllegalArgumentException("URI is null"); } if( !classJarURI.getScheme().equals(IOUtil.JAR_SCHEME) ) { throw new IllegalArgumentException("URI is not a using scheme "+IOUtil.JAR_SCHEME+": <"+classJarURI+">"); } String uriS = classJarURI.getSchemeSpecificPart(); - - // from + + // from // file:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class // to // file:/some/path/gluegen-rt.jar @@ -324,18 +324,18 @@ public class JarUtil { } /** - * The Class's <code>com.jogamp.common.GlueGenVersion</code> + * The Class's <code>com.jogamp.common.GlueGenVersion</code> * URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class</code> * Jar file's sub URI <code><i>sub_protocol</i>:/some/path/gluegen-rt.jar</code> will be returned. * <p> * <i>sub_protocol</i> may be "file", "http", etc.. * </p> - * + * * @param clazzBinName <code>com.jogamp.common.GlueGenVersion</code> * @param cl * @return <code><i>sub_protocol</i>:/some/path/gluegen-rt.jar</code> - * @throws IllegalArgumentException if the URI doesn't match the expected formatting - * @throws IOException if the class's Jar file could not been found by the ClassLoader + * @throws IllegalArgumentException if the URI doesn't match the expected formatting + * @throws IOException if the class's Jar file could not been found by the ClassLoader * @throws URISyntaxException if the URI could not be translated into a RFC 2396 URI * @see {@link IOUtil#getClassURL(String, ClassLoader)} */ @@ -344,18 +344,18 @@ public class JarUtil { } /** - * The Class's <code>"com.jogamp.common.GlueGenVersion"</code> + * The Class's <code>"com.jogamp.common.GlueGenVersion"</code> * URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class"</code> * Jar file URI <code>jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/</code> will be returned. * <p> * <i>sub_protocol</i> may be "file", "http", etc.. * </p> - * - * @param clazzBinName "com.jogamp.common.GlueGenVersion" + * + * @param clazzBinName "com.jogamp.common.GlueGenVersion" * @param cl * @return "jar:<i>sub_protocol</i>:/some/path/gluegen-rt.jar!/" - * @throws IllegalArgumentException if the URI doesn't match the expected formatting or null arguments - * @throws IOException if the class's Jar file could not been found by the ClassLoader + * @throws IllegalArgumentException if the URI doesn't match the expected formatting or null arguments + * @throws IOException if the class's Jar file could not been found by the ClassLoader * @throws URISyntaxException if the URI could not be translated into a RFC 2396 URI * @see {@link IOUtil#getClassURL(String, ClassLoader)} */ @@ -374,7 +374,7 @@ public class JarUtil { * @param baseUri file:/some/path/ * @param jarFileName gluegen-rt.jar * @return jar:file:/some/path/gluegen-rt.jar!/ - * @throws URISyntaxException + * @throws URISyntaxException * @throws IllegalArgumentException null arguments */ public static URI getJarFileURI(URI baseUri, String jarFileName) throws IllegalArgumentException, URISyntaxException { @@ -383,12 +383,12 @@ public class JarUtil { } return new URI(IOUtil.JAR_SCHEME, baseUri.toString()+jarFileName+"!/", null); } - + /** * @param jarSubUri file:/some/path/gluegen-rt.jar * @return jar:file:/some/path/gluegen-rt.jar!/ * @throws IllegalArgumentException null arguments - * @throws URISyntaxException + * @throws URISyntaxException */ public static URI getJarFileURI(URI jarSubUri) throws IllegalArgumentException, URISyntaxException { if(null == jarSubUri) { @@ -396,12 +396,12 @@ public class JarUtil { } return new URI(IOUtil.JAR_SCHEME, jarSubUri.toString()+"!/", null); } - + /** * @param jarSubUriS file:/some/path/gluegen-rt.jar * @return jar:file:/some/path/gluegen-rt.jar!/ * @throws IllegalArgumentException null arguments - * @throws URISyntaxException + * @throws URISyntaxException */ public static URI getJarFileURI(String jarSubUriS) throws IllegalArgumentException, URISyntaxException { if(null == jarSubUriS) { @@ -409,13 +409,13 @@ public class JarUtil { } return new URI(IOUtil.JAR_SCHEME, jarSubUriS+"!/", null); } - + /** * @param jarFileURI jar:file:/some/path/gluegen-rt.jar!/ * @param jarEntry com/jogamp/common/GlueGenVersion.class * @return jar:file:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class * @throws IllegalArgumentException null arguments - * @throws URISyntaxException + * @throws URISyntaxException */ public static URI getJarEntryURI(URI jarFileURI, String jarEntry) throws IllegalArgumentException, URISyntaxException { if(null == jarEntry) { @@ -423,12 +423,12 @@ public class JarUtil { } return new URI(jarFileURI.toString()+jarEntry); } - + /** - * @param clazzBinName com.jogamp.common.util.cache.TempJarCache - * @param cl domain + * @param clazzBinName com.jogamp.common.util.cache.TempJarCache + * @param cl domain * @return JarFile containing the named class within the given ClassLoader - * @throws IOException if the class's Jar file could not been found by the ClassLoader + * @throws IOException if the class's Jar file could not been found by the ClassLoader * @throws IllegalArgumentException null arguments * @throws URISyntaxException if the URI could not be translated into a RFC 2396 URI * @see {@link #getJarFileURI(String, ClassLoader)} @@ -441,8 +441,8 @@ public class JarUtil { * @param jarFileURI jar:file:/some/path/gluegen-rt.jar!/ * @return JarFile as named by URI within the given ClassLoader * @throws IllegalArgumentException null arguments - * @throws IOException if the Jar file could not been found - * @throws URISyntaxException + * @throws IOException if the Jar file could not been found + * @throws URISyntaxException */ public static JarFile getJarFile(URI jarFileURI) throws IOException, IllegalArgumentException, URISyntaxException { if(null == jarFileURI) { @@ -452,22 +452,22 @@ public class JarUtil { System.out.println("getJarFile: "+jarFileURI.toString()); } final URL jarFileURL = IOUtil.toURL(jarFileURI); - // final URL jarFileURL = jarFileURI.toURL(); // doesn't work due to encoded path even w/ file schema! + // final URL jarFileURL = jarFileURI.toURL(); // doesn't work due to encoded path even w/ file schema! final URLConnection urlc = jarFileURL.openConnection(); if(urlc instanceof JarURLConnection) { JarURLConnection jarConnection = (JarURLConnection)jarFileURL.openConnection(); JarFile jarFile = jarConnection.getJarFile(); if(DEBUG) { System.out.println("getJarFile res: "+jarFile.getName()); - } + } return jarFile; } if(DEBUG) { System.out.println("getJarFile res: NULL"); - } + } return null; } - + /** * Return a map from native-lib-base-name to entry-name. */ @@ -478,12 +478,12 @@ public class JarUtil { final Map<String,String> nameMap = new HashMap<String, String>(); final Enumeration<JarEntry> entries = jarFile.entries(); - + while (entries.hasMoreElements()) { final JarEntry entry = entries.nextElement(); final String entryName = entry.getName(); final String baseName = NativeLibrary.isValidNativeLibraryName(entryName, false); - + if(null != baseName) { nameMap.put(baseName, entryName); } @@ -503,7 +503,7 @@ public class JarUtil { * Root entries are favored over non root entries in case of naming collisions.<br> * Example on a Unix like machine:<br> * <pre> - * mylib.jar!/sub1/libsour.so -> sour (mapped, unique name) + * mylib.jar!/sub1/libsour.so -> sour (mapped, unique name) * mylib.jar!/sub1/libsweet.so (dropped, root entry favored) * mylib.jar!/libsweet.so -> sweet (mapped, root entry favored) * mylib.jar!/sweet.dll -> (dropped, not a unix library name) @@ -515,11 +515,11 @@ public class JarUtil { * In this case, set all flags to true <code>extractNativeLibraries </code>. * <code>extractClassFiles</code>, <code>extractOtherFiles</code>. * </p> - * + * * @param dest * @param nativeLibMap * @param jarFile - * @param nativeLibraryPath if not null, only extracts native libraries within this path. + * @param nativeLibraryPath if not null, only extracts native libraries within this path. * @param extractNativeLibraries * @param extractClassFiles * @param extractOtherFiles @@ -527,7 +527,7 @@ public class JarUtil { * @return * @throws IOException */ - public static final int extract(File dest, Map<String, String> nativeLibMap, + public static final int extract(File dest, Map<String, String> nativeLibMap, JarFile jarFile, String nativeLibraryPath, boolean extractNativeLibraries, @@ -573,7 +573,7 @@ public class JarUtil { } } } - + final boolean isClassFile = entryName.endsWith(".class"); if(isClassFile && !extractClassFiles) { if (DEBUG) { @@ -581,7 +581,7 @@ public class JarUtil { } continue; } - + if(!isNativeLib && !isClassFile && !extractOtherFiles) { if (DEBUG) { System.err.println("JarUtil: JarEntry : " + entryName + " other-file skipped"); @@ -590,16 +590,16 @@ public class JarUtil { } final boolean isDir = entryName.endsWith("/"); - - final boolean isRootEntry = entryName.indexOf('/') == -1 && + + final boolean isRootEntry = entryName.indexOf('/') == -1 && entryName.indexOf(File.separatorChar) == -1; - + if (DEBUG) { - System.err.println("JarUtil: JarEntry : isNativeLib " + isNativeLib + + System.err.println("JarUtil: JarEntry : isNativeLib " + isNativeLib + ", isClassFile " + isClassFile + ", isDir " + isDir + ", isRootEntry " + isRootEntry ); } - + final File destFile = new File(dest, entryName); if(isDir) { if (DEBUG) { @@ -611,12 +611,12 @@ public class JarUtil { if(!destFolder.exists()) { if (DEBUG) { System.err.println("JarUtil: MKDIR (parent): " + entryName + " -> " + destFolder ); - } + } destFolder.mkdirs(); } final InputStream in = new BufferedInputStream(jarFile.getInputStream(entry)); final OutputStream out = new BufferedOutputStream(new FileOutputStream(destFile)); - int numBytes = -1; + int numBytes = -1; try { numBytes = IOUtil.copyStream2Stream(BUFFER_SIZE, in, out, -1); } finally { @@ -626,7 +626,7 @@ public class JarUtil { boolean addedAsNativeLib = false; if (numBytes>0) { num++; - if (isNativeLib && ( isRootEntry || !nativeLibMap.containsKey(libBaseName) ) ) { + if (isNativeLib && ( isRootEntry || !nativeLibMap.containsKey(libBaseName) ) ) { nativeLibMap.put(libBaseName, destFile.getAbsolutePath()); addedAsNativeLib = true; } @@ -647,7 +647,7 @@ public class JarUtil { getCodeSource().getCertificates(); </pre> */ - public static final void validateCertificates(Certificate[] rootCerts, JarFile jarFile) + public static final void validateCertificates(Certificate[] rootCerts, JarFile jarFile) throws IOException, SecurityException { if (DEBUG) { @@ -673,7 +673,7 @@ public class JarUtil { * Check the certificates with the ones in the jar file * (all must match). */ - private static final void validateCertificate(Certificate[] rootCerts, + private static final void validateCertificate(Certificate[] rootCerts, JarFile jar, JarEntry entry, byte[] buf) throws IOException, SecurityException { if (DEBUG) { diff --git a/src/java/com/jogamp/common/util/JogampVersion.java b/src/java/com/jogamp/common/util/JogampVersion.java index 046f18c..2789de7 100644 --- a/src/java/com/jogamp/common/util/JogampVersion.java +++ b/src/java/com/jogamp/common/util/JogampVersion.java @@ -46,16 +46,16 @@ public class JogampVersion { public static final Attributes.Name IMPLEMENTATION_BRANCH = new Attributes.Name("Implementation-Branch"); /** See {@link #getImplementationCommit()} */ public static final Attributes.Name IMPLEMENTATION_COMMIT = new Attributes.Name("Implementation-Commit"); - + private String packageName; private Manifest mf; private int hash; private Attributes mainAttributes; private Set<?>/*<Attributes.Name>*/ mainAttributeNames; - + private final String androidPackageVersionName; - - protected JogampVersion(String packageName, Manifest mf) { + + protected JogampVersion(String packageName, Manifest mf) { this.packageName = packageName; this.mf = ( null != mf ) ? mf : new Manifest(); this.hash = this.mf.hashCode(); @@ -104,7 +104,7 @@ public class JogampVersion { } /** - * @return set of type {@link Attributes.Name}, disguised as anonymous + * @return set of type {@link Attributes.Name}, disguised as anonymous */ public final Set<?>/*<Attributes.Name>*/ getAttributeNames() { return mainAttributeNames; @@ -117,13 +117,13 @@ public class JogampVersion { return this.getAttribute(Attributes.Name.EXTENSION_NAME); } - /** + /** * Returns the implementation build number, e.g. <code>2.0-b456-20130328</code>. */ public final String getImplementationBuild() { return this.getAttribute(GlueGenVersion.IMPLEMENTATION_BUILD); } - + /** * Returns the SCM branch name */ @@ -168,7 +168,7 @@ public class JogampVersion { public final String getAndroidPackageVersionName() { return androidPackageVersionName; } - + public final String getSpecificationTitle() { return this.getAttribute(Attributes.Name.SPECIFICATION_TITLE); } @@ -220,7 +220,7 @@ public class JogampVersion { return sb; } - + @Override public String toString() { return toString(null).toString(); diff --git a/src/java/com/jogamp/common/util/LFRingbuffer.java b/src/java/com/jogamp/common/util/LFRingbuffer.java index f704047..1ca1e20 100644 --- a/src/java/com/jogamp/common/util/LFRingbuffer.java +++ b/src/java/com/jogamp/common/util/LFRingbuffer.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -31,7 +31,7 @@ package com.jogamp.common.util; import java.io.PrintStream; import java.lang.reflect.Array; -/** +/** * Simple implementation of {@link Ringbuffer}, * exposing <i>lock-free</i> * {@link #get() get*(..)} and {@link #put(Object) put*(..)} methods. @@ -80,11 +80,11 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { private volatile int readPos; private volatile int writePos; private volatile int size; - + public final String toString() { return "LFRingbuffer<?>[filled "+size+" / "+(capacityPlusOne-1)+", writePos "+writePos+", readPos "+readPos+"]"; } - + public final void dump(PrintStream stream, String prefix) { stream.println(prefix+" "+toString()+" {"); for(int i=0; i<capacityPlusOne; i++) { @@ -92,10 +92,10 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { } stream.println("}"); } - - /** + + /** * Create a full ring buffer instance w/ the given array's net capacity and content. - * <p> + * <p> * Example for a 10 element Integer array: * <pre> * Integer[] source = new Integer[10]; @@ -111,7 +111,7 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { * and copy all elements from array <code>copyFrom</code> into the internal array. * </p> * @param copyFrom mandatory source array determining ring buffer's net {@link #capacity()} and initial content. - * @throws IllegalArgumentException if <code>copyFrom</code> is <code>null</code> + * @throws IllegalArgumentException if <code>copyFrom</code> is <code>null</code> */ @SuppressWarnings("unchecked") public LFRingbuffer(T[] copyFrom) throws IllegalArgumentException { @@ -119,10 +119,10 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { array = (T[]) newArray(copyFrom.getClass(), capacityPlusOne); resetImpl(true, copyFrom); } - - /** + + /** * Create an empty ring buffer instance w/ the given net <code>capacity</code>. - * <p> + * <p> * Example for a 10 element Integer array: * <pre> * Ringbuffer<Integer> rb = new LFRingbuffer<Integer>(10, Integer[].class); @@ -142,13 +142,13 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { array = (T[]) newArray(arrayType, capacityPlusOne); resetImpl(false, null /* empty, nothing to copy */ ); } - + @Override public final T[] getInternalArray() { return array; } - + @Override public final int capacity() { return capacityPlusOne-1; } - + @Override public final void clear() { synchronized ( syncGlobal ) { @@ -158,12 +158,12 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { } } } - + @Override public final void resetFull(T[] copyFrom) throws IllegalArgumentException { resetImpl(true, copyFrom); } - + private final void resetImpl(boolean full, T[] copyFrom) throws IllegalArgumentException { synchronized ( syncGlobal ) { if( null != copyFrom ) { @@ -185,21 +185,21 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { } } } - + @Override public final int size() { return size; } - + @Override public final int getFreeSlots() { return capacityPlusOne - 1 - size; } @Override public final boolean isEmpty() { return 0 == size; } - + @Override public final boolean isFull() { return capacityPlusOne - 1 == size; } - + /** - * {@inheritDoc} + * {@inheritDoc} * <p> * Implementation advances the read position and returns the element at it, if not empty. * </p> @@ -212,7 +212,7 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { } /** - * {@inheritDoc} + * {@inheritDoc} * <p> * Implementation advances the read position and returns the element at it, if not empty. * </p> @@ -221,7 +221,7 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { public final T getBlocking() throws InterruptedException { return getImpl(true, false); } - + @Override public final T peek() { try { @@ -232,7 +232,7 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { public final T peekBlocking() throws InterruptedException { return getImpl(true, true); } - + private final T getImpl(boolean blocking, boolean peek) throws InterruptedException { int localReadPos = readPos; if( localReadPos == writePos ) { @@ -258,9 +258,9 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { } return r; } - + /** - * {@inheritDoc} + * {@inheritDoc} * <p> * Implementation advances the write position and stores the given element at it, if not full. * </p> @@ -271,9 +271,9 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { return putImpl(e, false, false); } catch (InterruptedException ie) { throw new RuntimeException(ie); } } - - /** - * {@inheritDoc} + + /** + * {@inheritDoc} * <p> * Implementation advances the write position and stores the given element at it, if not full. * </p> @@ -284,10 +284,10 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { throw new InternalError("Blocking put failed: "+this); } } - + /** * {@inheritDoc} - * <p> + * <p> * Implementation advances the write position and keeps the element at it, if not full. * </p> */ @@ -295,7 +295,7 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { public final boolean putSame(boolean blocking) throws InterruptedException { return putImpl(null, true, blocking); } - + private final boolean putImpl(T e, boolean sameRef, boolean blocking) throws InterruptedException { int localWritePos = writePos; localWritePos = (localWritePos + 1) % capacityPlusOne; @@ -320,8 +320,8 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { } return true; } - - + + @Override public final void waitForFreeSlots(int count) throws InterruptedException { synchronized ( syncRead ) { @@ -332,10 +332,10 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { } } } - + @Override public final void growEmptyBuffer(final T[] newElements) throws IllegalStateException, IllegalArgumentException { - synchronized( syncGlobal ) { + synchronized( syncGlobal ) { if( null == newElements ) { throw new IllegalArgumentException("newElements is null"); } @@ -355,15 +355,15 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { if( readPos != writePos ) { throw new InternalError("R/W pos not equal at empty: "+this); } - + final int growAmount = newElements.length; final int newCapacity = capacityPlusOne + growAmount; final T[] oldArray = array; final T[] newArray = (T[]) newArray(arrayTypeInternal, newCapacity); - + // writePos == readPos writePos += growAmount; // warp writePos to the end of the new data location - + if( readPos >= 0 ) { System.arraycopy(oldArray, 0, newArray, 0, readPos+1); } @@ -374,13 +374,13 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { if( tail > 0 ) { System.arraycopy(oldArray, readPos+1, newArray, writePos+1, tail); } - size = growAmount; - + size = growAmount; + capacityPlusOne = newCapacity; array = newArray; } } - + @Override public final void growFullBuffer(final int growAmount) throws IllegalStateException, IllegalArgumentException { synchronized ( syncGlobal ) { @@ -389,7 +389,7 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { } if( capacityPlusOne-1 != size ) { throw new IllegalStateException("Buffer is not full: "+this); - } + } final int wp1 = ( writePos + 1 ) % capacityPlusOne; if( wp1 != readPos ) { throw new InternalError("R != W+1 pos at full: "+this); @@ -400,10 +400,10 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { final int newCapacity = capacityPlusOne + growAmount; final T[] oldArray = array; final T[] newArray = (T[]) newArray(arrayTypeInternal, newCapacity); - + // writePos == readPos - 1 readPos = ( writePos + 1 + growAmount ) % newCapacity; // warp readPos to the end of the new data location - + if(writePos >= 0) { System.arraycopy(oldArray, 0, newArray, 0, writePos+1); } @@ -411,12 +411,12 @@ public class LFRingbuffer<T> implements Ringbuffer<T> { if( tail > 0 ) { System.arraycopy(oldArray, writePos+1, newArray, readPos, tail); } - + capacityPlusOne = newCapacity; array = newArray; } } - + @SuppressWarnings("unchecked") private static <T> T[] newArray(Class<? extends T[]> arrayType, int length) { return ((Object)arrayType == (Object)Object[].class) diff --git a/src/java/com/jogamp/common/util/PrimitiveStack.java b/src/java/com/jogamp/common/util/PrimitiveStack.java index 89ae72e..e357e4a 100644 --- a/src/java/com/jogamp/common/util/PrimitiveStack.java +++ b/src/java/com/jogamp/common/util/PrimitiveStack.java @@ -31,50 +31,50 @@ package com.jogamp.common.util; * Simple primitive-type stack. */ public interface PrimitiveStack { - - /** + + /** * Returns this stack's current capacity. * <p> * The capacity may grow with a put operation w/ insufficient {@link #remaining()} elements left, if {@link #getGrowSize()} > 0. - * </p> + * </p> */ int capacity(); - - /** + + /** * Returns the current position of this stack. * <p> - * Position is in the range: 0 ≤ position < {@link #capacity()}. + * Position is in the range: 0 ≤ position < {@link #capacity()}. * </p> * <p> * The position equals to the number of elements stored. * </p> **/ int position(); - + /** * Sets the position of this stack. - * + * * @param newPosition the new position * @throws IndexOutOfBoundsException if <code>newPosition</code> is outside of range: 0 ≤ position < {@link #capacity()}. */ void position(int newPosition) throws IndexOutOfBoundsException; - - /** + + /** * Returns the remaining elements left before stack will grow about {@link #getGrowSize()}. * <pre> * remaining := capacity() - position(); * </pre> - * <p> + * <p> * 0 denotes a full stack. - * </p> + * </p> * @see #capacity() * @see #position() **/ int remaining(); - + /** Returns the grow size. A stack grows by this size in case a put operation exceeds it's {@link #capacity()}. */ int getGrowSize(); /** Set new {@link #growSize(). */ - void setGrowSize(int newGrowSize); + void setGrowSize(int newGrowSize); } diff --git a/src/java/com/jogamp/common/util/PropertyAccess.java b/src/java/com/jogamp/common/util/PropertyAccess.java index fdb2665..5a8f082 100644 --- a/src/java/com/jogamp/common/util/PropertyAccess.java +++ b/src/java/com/jogamp/common/util/PropertyAccess.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -38,32 +38,32 @@ public class PropertyAccess { public static final String jnlp_prefix = "jnlp." ; /** trusted build-in property prefix 'javaws.' */ public static final String javaws_prefix = "javaws."; - + static final HashSet<String> trustedPrefixes; static final HashSet<String> trusted; - + static { trustedPrefixes = new HashSet<String>(); trustedPrefixes.add(javaws_prefix); trustedPrefixes.add(jnlp_prefix); // 'jogamp.' and maybe other trusted prefixes will be added later via 'addTrustedPrefix()' - + trusted = new HashSet<String>(); trusted.add("sun.java2d.opengl"); trusted.add("sun.java2d.noddraw"); trusted.add("sun.java2d.d3d"); trusted.add("sun.awt.noerasebackground"); } - + /** * @param prefix New prefix to be registered as trusted. - * @throws AccessControlException as thrown by {@link SecurityUtil#checkAllPermissions()}. + * @throws AccessControlException as thrown by {@link SecurityUtil#checkAllPermissions()}. */ protected static final void addTrustedPrefix(String prefix) throws AccessControlException { SecurityUtil.checkAllPermissions(); trustedPrefixes.add(prefix); } - + public static final boolean isTrusted(String propertyKey) { final int dot1 = propertyKey.indexOf('.'); if(0<=dot1) { @@ -72,7 +72,7 @@ public class PropertyAccess { return false; } } - + /** @see #getProperty(String, boolean) */ public static final int getIntProperty(final String property, final boolean jnlpAlias, int defaultValue) { int i=defaultValue; @@ -120,22 +120,22 @@ public class PropertyAccess { * Query the property with the name <code>propertyKey</code>. * <p> * If <code>jnlpAlias</code> is <code>true</code> and the plain <code>propertyKey</code> - * could not be resolved, an attempt to resolve the JNLP aliased <i>trusted property</i> is made.<br> + * could not be resolved, an attempt to resolve the JNLP aliased <i>trusted property</i> is made.<br> * Example: For the propertyName <code>OneTwo</code>, the jnlp alias name is <code>jnlp.OneTwo</code>, which is considered trusted.<br> * </p> - * - * @param propertyKey the property name to query. + * + * @param propertyKey the property name to query. * @param jnlpAlias true if a fallback attempt to query the JNLP aliased <i>trusted property</i> shall be made, * otherwise false. * @return the property value if exists, or null - * + * * @throws NullPointerException if the property name is null * @throws IllegalArgumentException if the property name is of length 0 * @throws SecurityException if access is not allowed to the given <code>propertyKey</code> - * + * * @see System#getProperty(String) */ - public static final String getProperty(final String propertyKey, final boolean jnlpAlias) + public static final String getProperty(final String propertyKey, final boolean jnlpAlias) throws SecurityException, NullPointerException, IllegalArgumentException { if(null == propertyKey) { throw new NullPointerException("propertyKey is NULL"); @@ -144,14 +144,14 @@ public class PropertyAccess { throw new IllegalArgumentException("propertyKey is empty"); } String s=null; - + if( isTrusted(propertyKey) ) { // 'trusted' property (jnlp., javaws., jogamp., ..) s = getTrustedPropKey(propertyKey); } else { // may throw SecurityException, AccessControlerException s = System.getProperty(propertyKey); - } + } if( null == s && jnlpAlias ) { // Try 'jnlp.' aliased property .. if( !propertyKey.startsWith(jnlp_prefix) ) { @@ -162,9 +162,9 @@ public class PropertyAccess { } return s; } - + /** See {@link #getProperty(String, boolean)}, additionally allows a <code>defaultValue</code> if property value is <code>null</code>. */ - public static final String getProperty(final String propertyKey, final boolean jnlpAlias, String defaultValue) + public static final String getProperty(final String propertyKey, final boolean jnlpAlias, String defaultValue) throws SecurityException, NullPointerException, IllegalArgumentException { final String s = PropertyAccess.getProperty(propertyKey, jnlpAlias); if( null != s ) { @@ -173,7 +173,7 @@ public class PropertyAccess { return defaultValue; } } - + private static final String getTrustedPropKey(final String propertyKey) { return AccessController.doPrivileged(new PrivilegedAction<String>() { public String run() { @@ -183,6 +183,6 @@ public class PropertyAccess { throw new SecurityException("Could not access trusted property '"+propertyKey+"'", se); } } - }); + }); } } diff --git a/src/java/com/jogamp/common/util/ReflectionUtil.java b/src/java/com/jogamp/common/util/ReflectionUtil.java index 8b9476f..598b8b1 100644 --- a/src/java/com/jogamp/common/util/ReflectionUtil.java +++ b/src/java/com/jogamp/common/util/ReflectionUtil.java @@ -1,22 +1,22 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. * Copyright (c) 2010 JogAmp Community. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: - * + * * - Redistribution of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * + * * - Redistribution 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 Sun Microsystems, Inc. or the names of * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. - * + * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A @@ -29,7 +29,7 @@ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * + * * You acknowledge that this software is not designed or intended for use * in the design, construction, operation or maintenance of any nuclear * facility. @@ -43,7 +43,7 @@ import com.jogamp.common.JogampRuntimeException; import jogamp.common.Debug; public final class ReflectionUtil { - + public static final boolean DEBUG = Debug.debug("ReflectionUtil"); public static class AWTNames { @@ -112,16 +112,16 @@ public final class ReflectionUtil { * Returns a compatible constructor * if available, otherwise throws an exception. * <p> - * It first attempts to get the specific Constructor - * using the given <code>cstrArgTypes</code>. + * It first attempts to get the specific Constructor + * using the given <code>cstrArgTypes</code>. * If this fails w/ <code>NoSuchMethodException</code>, a compatible * Constructor is being looked-up w/ with parameter types assignable * from the given <code>cstrArgs</code>. - * </p> - * + * </p> + * * @throws JogampRuntimeException if the constructor can not be delivered. */ - public static final Constructor<?> getConstructor(Class<?> clazz, Class<?> ... cstrArgTypes) + public static final Constructor<?> getConstructor(Class<?> clazz, Class<?> ... cstrArgTypes) throws JogampRuntimeException { if(null == cstrArgTypes) { cstrArgTypes = zeroTypes; @@ -147,13 +147,13 @@ public final class ReflectionUtil { if(types.length == j) { cstr = c; // gotcha } - } + } } } if(null == cstr) { throw new JogampRuntimeException("Constructor: '" + clazz.getName() + "(" + asString(cstrArgTypes) + ")' not found"); } - return cstr; + return cstr; } public static final Constructor<?> getConstructor(String clazzName, ClassLoader cl) @@ -164,7 +164,7 @@ public final class ReflectionUtil { /** * @throws JogampRuntimeException if the instance can not be created. */ - public static final Object createInstance(Constructor<?> cstr, Object ... cstrArgs) + public static final Object createInstance(Constructor<?> cstr, Object ... cstrArgs) throws JogampRuntimeException, RuntimeException { try { @@ -183,17 +183,17 @@ public final class ReflectionUtil { throw new JogampRuntimeException("can not create instance of "+cstr.getName(), t); } } - + /** * @throws JogampRuntimeException if the instance can not be created. */ - public static final Object createInstance(Class<?> clazz, Class<?>[] cstrArgTypes, Object ... cstrArgs) + public static final Object createInstance(Class<?> clazz, Class<?>[] cstrArgTypes, Object ... cstrArgs) throws JogampRuntimeException, RuntimeException { return createInstance(getConstructor(clazz, cstrArgTypes), cstrArgs); } - public static final Object createInstance(Class<?> clazz, Object ... cstrArgs) + public static final Object createInstance(Class<?> clazz, Object ... cstrArgs) throws JogampRuntimeException, RuntimeException { Class<?>[] cstrArgTypes = null; @@ -206,7 +206,7 @@ public final class ReflectionUtil { return createInstance(clazz, cstrArgTypes, cstrArgs); } - public static final Object createInstance(String clazzName, Class<?>[] cstrArgTypes, Object[] cstrArgs, ClassLoader cl) + public static final Object createInstance(String clazzName, Class<?>[] cstrArgTypes, Object[] cstrArgs, ClassLoader cl) throws JogampRuntimeException, RuntimeException { try { @@ -216,7 +216,7 @@ public final class ReflectionUtil { } } - public static final Object createInstance(String clazzName, Object[] cstrArgs, ClassLoader cl) + public static final Object createInstance(String clazzName, Object[] cstrArgs, ClassLoader cl) throws JogampRuntimeException, RuntimeException { Class<?>[] cstrArgTypes = null; @@ -345,24 +345,24 @@ public final class ReflectionUtil { } /** Convenient Method access class */ - public static class MethodAccessor { + public static class MethodAccessor { Method m = null; - + /** Check {@link #available()} before using instance. */ public MethodAccessor(Class<?> clazz, String methodName, Class<?> ... argTypes) { try { m = ReflectionUtil.getMethod(clazz, methodName, argTypes); } catch (JogampRuntimeException jre) { /* method n/a */ } } - + /** Returns true if method is available, otherwise false. */ public boolean available() { return null != m; } - - /** + + /** * Check {@link #available()} before calling to avoid throwing a JogampRuntimeException. - * @throws JogampRuntimeException if method is not available + * @throws JogampRuntimeException if method is not available */ public Object callMethod(Object instance, Object ... args) { if(null == m) { @@ -371,6 +371,6 @@ public final class ReflectionUtil { return ReflectionUtil.callMethod(instance, m, args); } } - + } diff --git a/src/java/com/jogamp/common/util/Ringbuffer.java b/src/java/com/jogamp/common/util/Ringbuffer.java index e524768..7faf5dd 100644 --- a/src/java/com/jogamp/common/util/Ringbuffer.java +++ b/src/java/com/jogamp/common/util/Ringbuffer.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -29,7 +29,7 @@ package com.jogamp.common.util; import java.io.PrintStream; -/** +/** * Ring buffer interface, a.k.a circular buffer. * <p> * Caller can chose whether to block until get / put is able to proceed or not. @@ -39,26 +39,26 @@ import java.io.PrintStream; * or using a preset array for circular access of same objects. * </p> * <p> - * Synchronization and hence thread safety details belong to the implementation. + * Synchronization and hence thread safety details belong to the implementation. * </p> */ public interface Ringbuffer<T> { - - /** Returns a short string representation incl. size/capacity and internal r/w index (impl. dependent). */ + + /** Returns a short string representation incl. size/capacity and internal r/w index (impl. dependent). */ public String toString(); /** Debug functionality - Dumps the contents of the internal array. */ public void dump(PrintStream stream, String prefix); - /** + /** * Returns the internal array as-is, i.e. w/o a copy. * <p> * The layout and size of the internal array is implementation dependent. - * </p> + * </p> * <p> * Users shall not modify or rely on the returned array. - * </p> - * @deprecated This method should not be required + * </p> + * @deprecated This method should not be required */ public T[] getInternalArray(); @@ -66,7 +66,7 @@ public interface Ringbuffer<T> { public int capacity(); /** - * Resets the read and write position according to an empty ring buffer + * Resets the read and write position according to an empty ring buffer * and set all ring buffer slots to <code>null</code>. * <p> * {@link #isEmpty()} will return <code>true</code> after calling this method. @@ -75,14 +75,14 @@ public interface Ringbuffer<T> { public void clear(); /** - * Resets the read and write position according to a full ring buffer + * Resets the read and write position according to a full ring buffer * and fill all slots w/ elements of array <code>copyFrom</code>. * <p> - * Array's <code>copyFrom</code> elements will be copied into the internal array, + * Array's <code>copyFrom</code> elements will be copied into the internal array, * hence it's length must be equal to {@link #capacity()}. * </p> * @param copyFrom Mandatory array w/ length {@link #capacity()} to be copied into the internal array. - * @throws IllegalArgumentException if <code>copyFrom</code> is <code>null</code>. + * @throws IllegalArgumentException if <code>copyFrom</code> is <code>null</code>. * @throws IllegalArgumentException if <code>copyFrom</code>'s length is different from {@link #capacity()}. */ public void resetFull(T[] copyFrom) throws IllegalArgumentException; @@ -108,7 +108,7 @@ public interface Ringbuffer<T> { * <p> * Method is non blocking and returns immediately;. * </p> - * @return the oldest put element if available, otherwise null. + * @return the oldest put element if available, otherwise null. */ public T get(); @@ -121,24 +121,24 @@ public interface Ringbuffer<T> { * <p> * Methods blocks until an element becomes available via put. * </p> - * @return the oldest put element - * @throws InterruptedException + * @return the oldest put element + * @throws InterruptedException */ public T getBlocking() throws InterruptedException; - /** + /** * Peeks the next element at the read position w/o modifying pointer, nor blocking. * @return <code>null</code> if empty, otherwise the element which would be read next. */ public T peek(); - /** + /** * Peeks the next element at the read position w/o modifying pointer, but w/ blocking. * @return <code>null</code> if empty, otherwise the element which would be read next. */ public T peekBlocking() throws InterruptedException; - /** + /** * Enqueues the given element. * <p> * Returns true if successful, otherwise false in case buffer is full. @@ -149,16 +149,16 @@ public interface Ringbuffer<T> { */ public boolean put(T e); - /** + /** * Enqueues the given element. * <p> * Method blocks until a free slot becomes available via get. * </p> - * @throws InterruptedException + * @throws InterruptedException */ public void putBlocking(T e) throws InterruptedException; - /** + /** * Enqueues the same element at it's write position, if not full. * <p> * Returns true if successful, otherwise false in case buffer is full. @@ -167,7 +167,7 @@ public interface Ringbuffer<T> { * If <code>blocking</code> is true, method blocks until a free slot becomes available via get. * </p> * @param blocking if true, wait until a free slot becomes available via get. - * @throws InterruptedException + * @throws InterruptedException */ public boolean putSame(boolean blocking) throws InterruptedException; @@ -183,13 +183,13 @@ public interface Ringbuffer<T> { * Growing an empty ring buffer increases it's size about the amount, i.e. renders it not empty. * The new elements are inserted at the read position, able to be read out via {@link #get()} etc. * </p> - * + * * @param newElements array of new full elements the empty buffer shall grow about. * @throws IllegalStateException if buffer is not empty * @throws IllegalArgumentException if newElements is null */ public void growEmptyBuffer(T[] newElements) throws IllegalStateException, IllegalArgumentException; - + /** * Grows a full ring buffer, increasing it's capacity about the amount. * <p> @@ -197,7 +197,7 @@ public interface Ringbuffer<T> { * New <code>null</code> elements are inserted at the write position, able to be written to via {@link #put(Object)} etc. * </p> * @param amount the amount of elements the buffer shall grow about - * + * * @throws IllegalStateException if buffer is not full * @throws IllegalArgumentException if amount is < 0 */ diff --git a/src/java/com/jogamp/common/util/RunnableExecutor.java b/src/java/com/jogamp/common/util/RunnableExecutor.java index 7bf9685..629bc8c 100644 --- a/src/java/com/jogamp/common/util/RunnableExecutor.java +++ b/src/java/com/jogamp/common/util/RunnableExecutor.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -28,23 +28,23 @@ package com.jogamp.common.util; public interface RunnableExecutor { - /** This {@link RunnableExecutor} implementation simply invokes {@link Runnable#run()} + /** This {@link RunnableExecutor} implementation simply invokes {@link Runnable#run()} * on the current thread. */ public static final RunnableExecutor currentThreadExecutor = new CurrentThreadExecutor(); - + /** - * @param wait if true method waits until {@link Runnable#run()} is completed, otherwise don't wait. + * @param wait if true method waits until {@link Runnable#run()} is completed, otherwise don't wait. * @param r the {@link Runnable} to be executed. */ void invoke(boolean wait, Runnable r); - + static class CurrentThreadExecutor implements RunnableExecutor { private CurrentThreadExecutor() {} - + @Override public void invoke(boolean wait, Runnable r) { - r.run(); - } + r.run(); + } } } diff --git a/src/java/com/jogamp/common/util/RunnableTask.java b/src/java/com/jogamp/common/util/RunnableTask.java index c18556b..1db4810 100644 --- a/src/java/com/jogamp/common/util/RunnableTask.java +++ b/src/java/com/jogamp/common/util/RunnableTask.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,12 +20,12 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ - + package com.jogamp.common.util; import java.io.PrintStream; @@ -39,13 +39,13 @@ public class RunnableTask extends TaskBase { /** * Invoks <code>runnable</code>. - * @param waitUntilDone if <code>true</code>, waits until <code>runnable</code> execution is completed, otherwise returns immediately. + * @param waitUntilDone if <code>true</code>, waits until <code>runnable</code> execution is completed, otherwise returns immediately. * @param runnable the {@link Runnable} to execute. */ public static void invoke(boolean waitUntilDone, Runnable runnable) { Throwable throwable = null; final Object sync = new Object(); - final RunnableTask rt = new RunnableTask( runnable, waitUntilDone ? sync : null, true, waitUntilDone ? null : System.err ); + final RunnableTask rt = new RunnableTask( runnable, waitUntilDone ? sync : null, true, waitUntilDone ? null : System.err ); synchronized(sync) { rt.run(); if( waitUntilDone ) { @@ -63,14 +63,14 @@ public class RunnableTask extends TaskBase { } } } - + /** * Create a RunnableTask object w/ synchronization, - * ie. suitable for <code>invokeAndWait()</code>, i.e. {@link #invoke(boolean, Runnable) invoke(true, runnable)}. - * + * ie. suitable for <code>invokeAndWait()</code>, i.e. {@link #invoke(boolean, Runnable) invoke(true, runnable)}. + * * @param runnable The user action * @param syncObject The synchronization object if caller wait until <code>runnable</code> execution is completed, - * or <code>null</code> if waiting is not desired. + * or <code>null</code> if waiting is not desired. * @param catchExceptions Influence an occurring exception during <code>runnable</code> execution. * If <code>true</code>, the exception is silenced and can be retrieved via {@link #getThrowable()}, * otherwise the exception is thrown. @@ -79,7 +79,7 @@ public class RunnableTask extends TaskBase { public RunnableTask(Runnable runnable, Object syncObject, boolean catchExceptions, PrintStream exceptionOut) { super(syncObject, catchExceptions, exceptionOut); this.runnable = runnable ; - } + } /** Return the user action */ public final Runnable getRunnable() { @@ -104,7 +104,7 @@ public class RunnableTask extends TaskBase { throw new RuntimeException(runnableException); } } finally { - tExecuted = System.currentTimeMillis(); + tExecuted = System.currentTimeMillis(); } } else { synchronized (syncObject) { @@ -125,7 +125,7 @@ public class RunnableTask extends TaskBase { syncObject.notifyAll(); } } - } - } + } + } } diff --git a/src/java/com/jogamp/common/util/SecurityUtil.java b/src/java/com/jogamp/common/util/SecurityUtil.java index 6b35c9c..742de84 100644 --- a/src/java/com/jogamp/common/util/SecurityUtil.java +++ b/src/java/com/jogamp/common/util/SecurityUtil.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -39,11 +39,11 @@ public class SecurityUtil { private static final SecurityManager securityManager; private static final Permission allPermissions; private static final boolean DEBUG = false; - + static { allPermissions = new AllPermission(); securityManager = System.getSecurityManager(); - + if( DEBUG ) { final boolean hasAllPermissions; { @@ -55,12 +55,12 @@ public class SecurityUtil { try { insecPD.implies(allPermissions); _hasAllPermissions = true; - } catch( SecurityException ace ) { + } catch( SecurityException ace ) { _hasAllPermissions = false; } hasAllPermissions = _hasAllPermissions; } - + System.err.println("SecurityUtil: Has SecurityManager: "+ ( null != securityManager ) ) ; System.err.println("SecurityUtil: Has AllPermissions: "+hasAllPermissions); final Certificate[] certs = AccessController.doPrivileged(new PrivilegedAction<Certificate[]>() { @@ -75,7 +75,7 @@ public class SecurityUtil { } } } - + /** * Returns <code>true</code> if no {@link SecurityManager} has been installed * or the installed {@link SecurityManager}'s <code>checkPermission(new AllPermission())</code> @@ -84,7 +84,7 @@ public class SecurityUtil { public static final boolean hasAllPermissions() { return hasPermission(allPermissions); } - + /** * Returns <code>true</code> if no {@link SecurityManager} has been installed * or the installed {@link SecurityManager}'s <code>checkPermission(perm)</code> @@ -94,11 +94,11 @@ public class SecurityUtil { try { checkPermission(perm); return true; - } catch( SecurityException ace ) { + } catch( SecurityException ace ) { return false; } } - + /** * Throws an {@link SecurityException} if an installed {@link SecurityManager} * does not permit the requested {@link AllPermission}. @@ -106,7 +106,7 @@ public class SecurityUtil { public static final void checkAllPermissions() throws SecurityException { checkPermission(allPermissions); } - + /** * Throws an {@link SecurityException} if an installed {@link SecurityManager} * does not permit the requested {@link Permission}. @@ -116,7 +116,7 @@ public class SecurityUtil { securityManager.checkPermission(perm); } } - + /** * Returns <code>true</code> if no {@link SecurityManager} has been installed * or the installed {@link SecurityManager}'s <code>checkLink(libName)</code> @@ -126,11 +126,11 @@ public class SecurityUtil { try { checkLinkPermission(libName); return true; - } catch( SecurityException ace ) { + } catch( SecurityException ace ) { return false; } } - + /** * Throws an {@link SecurityException} if an installed {@link SecurityManager} * does not permit to dynamically link the given libName. @@ -140,7 +140,7 @@ public class SecurityUtil { securityManager.checkLink(libName); } } - + /** * Throws an {@link SecurityException} if an installed {@link SecurityManager} * does not permit to dynamically link to all libraries. @@ -151,7 +151,7 @@ public class SecurityUtil { } } private static final RuntimePermission allLinkPermission = new RuntimePermission("loadLibrary.*"); - + /** * @param clz * @return @@ -163,7 +163,7 @@ public class SecurityUtil { final Certificate[] certs = (null != cs) ? cs.getCertificates() : null; return (null != certs && certs.length>0) ? certs : null; } - + public static final boolean equals(Certificate[] a, Certificate[] b) { if(a == b) { return true; @@ -174,11 +174,11 @@ public class SecurityUtil { if(a.length != b.length) { return false; } - + int i = 0; while( i < a.length && a[i].equals(b[i]) ) { i++; - } + } return i == a.length; - } + } } diff --git a/src/java/com/jogamp/common/util/SyncedRingbuffer.java b/src/java/com/jogamp/common/util/SyncedRingbuffer.java index 747629b..8ef2970 100644 --- a/src/java/com/jogamp/common/util/SyncedRingbuffer.java +++ b/src/java/com/jogamp/common/util/SyncedRingbuffer.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -31,7 +31,7 @@ package com.jogamp.common.util; import java.io.PrintStream; import java.lang.reflect.Array; -/** +/** * Simple synchronized implementation of {@link Ringbuffer}. * <p> * All methods utilize global synchronization. @@ -56,12 +56,12 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { private int readPos; private int writePos; private int size; - + @Override public final String toString() { return "SyncedRingbuffer<?>[filled "+size+" / "+capacity+", writePos "+writePos+", readPos "+readPos+"]"; } - + @Override public final void dump(PrintStream stream, String prefix) { stream.println(prefix+" "+toString()+" {"); @@ -70,10 +70,10 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { } stream.println("}"); } - - /** + + /** * Create a full ring buffer instance w/ the given array's net capacity and content. - * <p> + * <p> * Example for a 10 element Integer array: * <pre> * Integer[] source = new Integer[10]; @@ -89,7 +89,7 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { * and copy all elements from array <code>copyFrom</code> into the internal array. * </p> * @param copyFrom mandatory source array determining ring buffer's net {@link #capacity()} and initial content. - * @throws IllegalArgumentException if <code>copyFrom</code> is <code>null</code> + * @throws IllegalArgumentException if <code>copyFrom</code> is <code>null</code> */ @SuppressWarnings("unchecked") public SyncedRingbuffer(T[] copyFrom) throws IllegalArgumentException { @@ -97,10 +97,10 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { array = (T[]) newArray(copyFrom.getClass(), capacity); resetImpl(true, copyFrom); } - - /** + + /** * Create an empty ring buffer instance w/ the given net <code>capacity</code>. - * <p> + * <p> * Example for a 10 element Integer array: * <pre> * Ringbuffer<Integer> rb = new SyncedRingbuffer<Integer>(10, Integer[].class); @@ -120,13 +120,13 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { this.array = (T[]) newArray(arrayType, capacity); resetImpl(false, null /* empty, nothing to copy */ ); } - + @Override public final T[] getInternalArray() { return array; } - + @Override public final int capacity() { return capacity; } - + /** * {@inheritDoc} * <p> @@ -142,12 +142,12 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { } } } - + @Override public final void resetFull(T[] copyFrom) throws IllegalArgumentException { resetImpl(true, copyFrom); } - + private final void resetImpl(boolean full, T[] copyFrom) throws IllegalArgumentException { synchronized ( syncGlobal ) { if( null != copyFrom ) { @@ -163,14 +163,14 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { size = full ? capacity : 0; } } - + @Override public final int size() { synchronized ( syncGlobal ) { return size; } } - + @Override public final int getFreeSlots() { synchronized ( syncGlobal ) { @@ -184,14 +184,14 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { return 0 == size; } } - + @Override public final boolean isFull() { synchronized ( syncGlobal ) { return capacity == size; } } - + /** * {@inheritDoc} * <p> @@ -215,7 +215,7 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { public final T getBlocking() throws InterruptedException { return getImpl(true, false); } - + @Override public final T peek() { try { @@ -226,9 +226,9 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { public final T peekBlocking() throws InterruptedException { return getImpl(true, true); } - + private final T getImpl(boolean blocking, boolean peek) throws InterruptedException { - synchronized( syncGlobal ) { + synchronized( syncGlobal ) { if( 0 == size ) { if( blocking ) { while( 0 == size ) { @@ -249,8 +249,8 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { return r; } } - - /** + + /** * {@inheritDoc} * <p> * Implementation stores the element at the current write position and advances it, if not full. @@ -262,8 +262,8 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { return putImpl(e, false, false); } catch (InterruptedException ie) { throw new RuntimeException(ie); } } - - /** + + /** * {@inheritDoc} * <p> * Implementation stores the element at the current write position and advances it, if not full. @@ -275,8 +275,8 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { throw new InternalError("Blocking put failed: "+this); } } - - /** + + /** * {@inheritDoc} * <p> * Implementation keeps the element at the current write position and advances it, if not full. @@ -286,9 +286,9 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { public final boolean putSame(boolean blocking) throws InterruptedException { return putImpl(null, true, blocking); } - + private final boolean putImpl(T e, boolean sameRef, boolean blocking) throws InterruptedException { - synchronized( syncGlobal ) { + synchronized( syncGlobal ) { if( capacity == size ) { if( blocking ) { while( capacity == size ) { @@ -308,7 +308,7 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { return true; } } - + @Override public final void waitForFreeSlots(int count) throws InterruptedException { synchronized ( syncGlobal ) { @@ -319,8 +319,8 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { } } } - - + + @Override public final void growEmptyBuffer(final T[] newElements) throws IllegalStateException, IllegalArgumentException { synchronized ( syncGlobal ) { @@ -340,15 +340,15 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { if( readPos != writePos ) { throw new InternalError("R/W pos not equal: "+this); } - + final int growAmount = newElements.length; final int newCapacity = capacity + growAmount; final T[] oldArray = array; final T[] newArray = (T[]) newArray(arrayTypeInternal, newCapacity); - + // writePos == readPos writePos += growAmount; // warp writePos to the end of the new data location - + if( readPos > 0 ) { System.arraycopy(oldArray, 0, newArray, 0, readPos); } @@ -360,12 +360,12 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { System.arraycopy(oldArray, readPos, newArray, writePos, tail); } size = growAmount; - + capacity = newCapacity; array = newArray; } } - + @Override public final void growFullBuffer(final int growAmount) throws IllegalStateException, IllegalArgumentException { synchronized ( syncGlobal ) { @@ -374,7 +374,7 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { } if( capacity != size ) { throw new IllegalStateException("Buffer is not full: "+this); - } + } if( readPos != writePos ) { throw new InternalError("R/W pos not equal: "+this); } @@ -384,10 +384,10 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { final int newCapacity = capacity + growAmount; final T[] oldArray = array; final T[] newArray = (T[]) newArray(arrayTypeInternal, newCapacity); - + // writePos == readPos readPos += growAmount; // warp readPos to the end of the new data location - + if(writePos > 0) { System.arraycopy(oldArray, 0, newArray, 0, writePos); } @@ -395,12 +395,12 @@ public class SyncedRingbuffer<T> implements Ringbuffer<T> { if( tail > 0 ) { System.arraycopy(oldArray, writePos, newArray, readPos, tail); } - + capacity = newCapacity; array = newArray; } } - + @SuppressWarnings("unchecked") private static <T> T[] newArray(Class<? extends T[]> arrayType, int length) { return ((Object)arrayType == (Object)Object[].class) diff --git a/src/java/com/jogamp/common/util/TaskBase.java b/src/java/com/jogamp/common/util/TaskBase.java index 35571e3..e76893d 100644 --- a/src/java/com/jogamp/common/util/TaskBase.java +++ b/src/java/com/jogamp/common/util/TaskBase.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,12 +20,12 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ - + package com.jogamp.common.util; import java.io.PrintStream; @@ -39,17 +39,17 @@ import jogamp.common.Debug; public abstract class TaskBase implements Runnable { /** Enable via the property <code>jogamp.debug.TaskBase.TraceSource</code> */ private static final boolean TRACE_SOURCE; - + static { Debug.initSingleton(); TRACE_SOURCE = Debug.isPropertyDefined("jogamp.debug.TaskBase.TraceSource", true); } - + protected final Object syncObject; protected final boolean catchExceptions; - protected final PrintStream exceptionOut; + protected final PrintStream exceptionOut; protected final Throwable sourceStack; - + protected Object attachment; protected Throwable runnableException; protected long tCreated, tStarted; @@ -66,7 +66,7 @@ public abstract class TaskBase implements Runnable { tExecuted = 0; isFlushed = false; } - + protected final String getExceptionOutIntro() { return catchExceptions ? "A catched" : "An uncatched"; } @@ -76,25 +76,25 @@ public abstract class TaskBase implements Runnable { } } - /** + /** * Return the synchronization object if any. - * @see #RunnableTask(Runnable, Object, boolean) + * @see #RunnableTask(Runnable, Object, boolean) */ public final Object getSyncObject() { return syncObject; } - - /** - * Attach a custom object to this task. - * Useful to piggybag further information, ie tag a task final. + + /** + * Attach a custom object to this task. + * Useful to piggybag further information, ie tag a task final. */ public final void setAttachment(Object o) { attachment = o; } - /** + /** * Return the attachment object if any. - * @see #setAttachment(Object) + * @see #setAttachment(Object) */ public final Object getAttachment() { return attachment; @@ -102,20 +102,20 @@ public abstract class TaskBase implements Runnable { @Override public abstract void run(); - - /** + + /** * Simply flush this task and notify a waiting executor. * The executor which might have been blocked until notified * will be unblocked and the task removed from the queue. - * + * * @see #isFlushed() * @see #isInQueue() - */ + */ public final void flush() { if(!isExecuted() && hasWaiter()) { synchronized (syncObject) { isFlushed = true; - syncObject.notifyAll(); + syncObject.notifyAll(); } } } @@ -124,7 +124,7 @@ public abstract class TaskBase implements Runnable { * @return !{@link #isExecuted()} && !{@link #isFlushed()} */ public final boolean isInQueue() { return 0 != tExecuted && !isFlushed; } - + /** * @return True if executed, otherwise false; */ @@ -136,7 +136,7 @@ public abstract class TaskBase implements Runnable { public final boolean isFlushed() { return isFlushed; } /** - * @return True if invoking thread waits until done, + * @return True if invoking thread waits until done, * ie a <code>notifyObject</code> was passed, otherwise false; */ public final boolean hasWaiter() { return null != syncObject; } diff --git a/src/java/com/jogamp/common/util/ValueConv.java b/src/java/com/jogamp/common/util/ValueConv.java index fa49341..9a16b64 100644 --- a/src/java/com/jogamp/common/util/ValueConv.java +++ b/src/java/com/jogamp/common/util/ValueConv.java @@ -5,14 +5,14 @@ package com.jogamp.common.util; * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -22,7 +22,7 @@ package com.jogamp.common.util; * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -51,7 +51,7 @@ public class ValueConv { } else { return (short) ( v * 65535.0f ); } - } + } public static final int float_to_int(float v, boolean dSigned) { // float significand 0x007fffff // double significand 0x000fffffffffffffL @@ -63,7 +63,7 @@ public class ValueConv { return (int) (long) ( v * 4294967295.0 ); } } - + public static final byte double_to_byte(double v, boolean dSigned) { // lossy if( dSigned ) { @@ -88,27 +88,27 @@ public class ValueConv { return (int) (long) ( v * 4294967295.0 ); } } - + public static final float byte_to_float(byte v, boolean sSigned) { if( sSigned ) { return (v & 0xff) / ( v > 0 ? 127.0f : -128.0f ) ; } else { return (v & 0xff) / 255.0f ; - } + } } public static final double byte_to_double(byte v, boolean sSigned) { if( sSigned ) { return (v & 0xff) / ( v > 0 ? 127.0 : -128.0 ) ; } else { return (v & 0xff) / 255.0 ; - } - } + } + } public static final float short_to_float(short v, boolean sSigned) { if( sSigned ) { return (v & 0xffff) / ( v > 0 ? 32767.0f : -32768.0f ) ; } else { return (v & 0xffff) / 65535.0f ; - } + } } public static final double short_to_double(short v, boolean sSigned) { // lossy @@ -116,8 +116,8 @@ public class ValueConv { return (v & 0xffff) / ( v > 0 ? 32767.0 : -32768.0 ) ; } else { return (v & 0xffff) / 65535.0 ; - } - } + } + } public static final float int_to_float(int v, boolean sSigned) { // lossy // float significand 0x007fffff @@ -128,30 +128,30 @@ public class ValueConv { return (float) ( v / ( v > 0 ? 2147483647.0 : 2147483648.0 ) ); } else { return (float) ( ((long)v & 0xffffffffL) / 4294967295.0 ); - } + } } public static final double int_to_double(int v, boolean sSigned) { if( sSigned ) { return v / ( v > 0 ? 2147483647.0 : 2147483648.0 ) ; } else { return ((long)v & 0xffffffffL) / 4294967295.0 ; - } + } } - + public static final short byte_to_short(byte v, boolean sSigned, boolean dSigned) { return float_to_short(byte_to_float(v, sSigned), dSigned); } public static final int byte_to_int(byte v, boolean sSigned, boolean dSigned) { return float_to_int(byte_to_float(v, sSigned), dSigned); } - + public static final byte short_to_byte(short v, boolean sSigned, boolean dSigned) { return float_to_byte(short_to_float(v, sSigned), dSigned); } public static final int short_to_int(short v, boolean sSigned, boolean dSigned) { return float_to_int(short_to_float(v, sSigned), dSigned); } - + public static final byte int_to_byte(int v, boolean sSigned, boolean dSigned) { return float_to_byte(int_to_float(v, sSigned), dSigned); } diff --git a/src/java/com/jogamp/common/util/VersionNumber.java b/src/java/com/jogamp/common/util/VersionNumber.java index b1d8963..addc879 100644 --- a/src/java/com/jogamp/common/util/VersionNumber.java +++ b/src/java/com/jogamp/common/util/VersionNumber.java @@ -33,7 +33,7 @@ import java.util.regex.Matcher; /** * Simple version number class containing a version number * either being {@link #VersionNumber(int, int, int) defined explicit} - * or {@link #VersionNumber(String, String) derived from a string}. + * or {@link #VersionNumber(String, String) derived from a string}. * <p> * For the latter case, you can query whether a component has been defined explicitly by the given <code>versionString</code>, * via {@link #hasMajor()}, {@link #hasMinor()} and {@link #hasSub()}. @@ -46,45 +46,45 @@ import java.util.regex.Matcher; */ public class VersionNumber implements Comparable<Object> { - /** - * A {@link #isZero() zero} version instance, w/o any component defined explicitly. + /** + * A {@link #isZero() zero} version instance, w/o any component defined explicitly. * @see #hasMajor() * @see #hasMinor() - * @see #hasSub() + * @see #hasSub() */ public static final VersionNumber zeroVersion = new VersionNumber(0, 0, 0, -1, (short)0); - + /** - * Returns the {@link java.util.regex.Pattern pattern} - * with Perl regular expression: + * Returns the {@link java.util.regex.Pattern pattern} + * with Perl regular expression: * <pre> * "\\D*(\\d+)[^\\"+delim+"\\s]*(?:\\"+delim+"\\D*(\\d+)[^\\"+delim+"\\s]*(?:\\"+delim+"\\D*(\\d+))?)?" * </pre> * </p> * <p> - * A whitespace within the version number will end the parser. + * A whitespace within the version number will end the parser. * </p> * <p> * Capture groups represent the major (1), optional minor (2) and optional sub version number (3) component in this order. * </p> * <p> - * Each capture group ignores any leading non-digit and uses only contiguous digits, i.e. ignores pending non-digits. + * Each capture group ignores any leading non-digit and uses only contiguous digits, i.e. ignores pending non-digits. * </p> * @param delim the delimiter, e.g. "." */ public static java.util.regex.Pattern getVersionNumberPattern(String delim) { return java.util.regex.Pattern.compile("\\D*(\\d+)[^\\"+delim+"\\s]*(?:\\"+delim+"\\D*(\\d+)[^\\"+delim+"\\s]*(?:\\"+delim+"\\D*(\\d+))?)?"); } - + /** - * Returns the default {@link java.util.regex.Pattern pattern} using {@link #getVersionNumberPattern(String)} + * Returns the default {@link java.util.regex.Pattern pattern} using {@link #getVersionNumberPattern(String)} * with delimiter "<b>.</b>". * <p> * Instance is cached. - * </p> - */ + * </p> + */ public static java.util.regex.Pattern getDefaultVersionNumberPattern() { - if( null == defPattern ) { // volatile dbl-checked-locking OK + if( null == defPattern ) { // volatile dbl-checked-locking OK synchronized( VersionNumber.class ) { if( null == defPattern ) { defPattern = getVersionNumberPattern("."); @@ -96,7 +96,7 @@ public class VersionNumber implements Comparable<Object> { private static volatile java.util.regex.Pattern defPattern = null; protected final int major, minor, sub, strEnd; - + protected final short state; protected final static short HAS_MAJOR = 1 << 0 ; protected final static short HAS_MINOR = 1 << 1 ; @@ -109,12 +109,12 @@ public class VersionNumber implements Comparable<Object> { strEnd = _strEnd; state = _state; } - - /** + + /** * Explicit version number instantiation, with all components defined explicitly. * @see #hasMajor() * @see #hasMinor() - * @see #hasSub() + * @see #hasSub() */ public VersionNumber(int majorRev, int minorRev, int subMinorRev) { this(majorRev, minorRev, subMinorRev, -1, (short)(HAS_MAJOR | HAS_MINOR | HAS_SUB)); @@ -124,41 +124,41 @@ public class VersionNumber implements Comparable<Object> { * String derived version number instantiation. * <p> * Utilizing the default {@link java.util.regex.Pattern pattern} parser with delimiter "<b>.</b>", see {@link #getDefaultVersionNumberPattern()}. - * </p> + * </p> * <p> * You can query whether a component has been defined explicitly by the given <code>versionString</code>, * via {@link #hasMajor()}, {@link #hasMinor()} and {@link #hasSub()}. * </p> * @param versionString should be given as [MAJOR[.MINOR[.SUB]]] - * + * * @see #hasMajor() * @see #hasMinor() - * @see #hasSub() + * @see #hasSub() */ public VersionNumber(final String versionString) { this(versionString, getDefaultVersionNumberPattern()); } - + /** * String derived version number instantiation. * <p> * Utilizing {@link java.util.regex.Pattern pattern} parser created via {@link #getVersionNumberPattern(String)}. - * </p> + * </p> * <p> * You can query whether a component has been defined explicitly by the given <code>versionString</code>, * via {@link #hasMajor()}, {@link #hasMinor()} and {@link #hasSub()}. * </p> * @param versionString should be given as [MAJOR[.MINOR[.SUB]]] * @param delim the delimiter, e.g. "." - * + * * @see #hasMajor() * @see #hasMinor() - * @see #hasSub() + * @see #hasSub() */ public VersionNumber(final String versionString, final String delim) { this(versionString, getVersionNumberPattern(delim)); } - + /** * String derived version number instantiation. * <p> @@ -167,10 +167,10 @@ public class VersionNumber implements Comparable<Object> { * </p> * @param versionString should be given as [MAJOR[.MINOR[.SUB]]] * @param versionPattern the {@link java.util.regex.Pattern pattern} parser, must be compatible w/ {@link #getVersionNumberPattern(String)} - * + * * @see #hasMajor() * @see #hasMinor() - * @see #hasSub() + * @see #hasSub() */ public VersionNumber(final String versionString, final java.util.regex.Pattern versionPattern) { // group1: \d* == digits major @@ -198,32 +198,32 @@ public class VersionNumber implements Comparable<Object> { } } } catch (Exception e) { } - + major = val[0]; minor = val[1]; sub = val[2]; strEnd = _strEnd; state = _state; } - - /** Returns <code>true</code>, if all version components are zero, otherwise <code>false</code>. */ + + /** Returns <code>true</code>, if all version components are zero, otherwise <code>false</code>. */ public final boolean isZero() { return major == 0 && minor == 0 && sub == 0; } - + /** Returns <code>true</code>, if the major component is defined explicitly, otherwise <code>false</code>. Undefined components has the value <code>0</code>. */ - public final boolean hasMajor() { return 0 != ( HAS_MAJOR & state ); } + public final boolean hasMajor() { return 0 != ( HAS_MAJOR & state ); } /** Returns <code>true</code>, if the optional minor component is defined explicitly, otherwise <code>false</code>. Undefined components has the value <code>0</code>. */ public final boolean hasMinor() { return 0 != ( HAS_MINOR & state ); } /** Returns <code>true</code>, if the optional sub component is defined explicitly, otherwise <code>false</code>. Undefined components has the value <code>0</code>. */ public final boolean hasSub() { return 0 != ( HAS_SUB & state ); } - - /** + + /** * If constructed with <code>version-string</code>, returns the string offset <i>after</i> the last matching character, * or <code>0</code> if none matched, or <code>-1</code> if not constructed with a string. */ public final int endOfStringMatch() { return strEnd; } - + @Override public final int hashCode() { // 31 * x == (x << 5) - x @@ -239,7 +239,7 @@ public class VersionNumber implements Comparable<Object> { } return false; } - + @Override public final int compareTo(Object o) { if ( ! ( o instanceof VersionNumber ) ) { @@ -265,7 +265,7 @@ public class VersionNumber implements Comparable<Object> { } return 0; } - + public final int getMajor() { return major; } diff --git a/src/java/com/jogamp/common/util/VersionNumberString.java b/src/java/com/jogamp/common/util/VersionNumberString.java index 143d57c..e23300c 100644 --- a/src/java/com/jogamp/common/util/VersionNumberString.java +++ b/src/java/com/jogamp/common/util/VersionNumberString.java @@ -34,28 +34,28 @@ package com.jogamp.common.util; */ public class VersionNumberString extends VersionNumber { - /** - * A {@link #isZero() zero} version instance, w/o any component defined explicitly. + /** + * A {@link #isZero() zero} version instance, w/o any component defined explicitly. * @see #hasMajor() * @see #hasMinor() - * @see #hasSub() + * @see #hasSub() */ public static final VersionNumberString zeroVersion = new VersionNumberString(0, 0, 0, -1, (short)0, "n/a"); - + protected final String strVal; protected VersionNumberString(int majorRev, int minorRev, int subMinorRev, int strEnd, short _state, String versionString) { super(majorRev, minorRev, subMinorRev, strEnd, _state); strVal = versionString; } - + /** * See {@link VersionNumber#VersionNumber(int, int, int)}. */ public VersionNumberString(int majorRev, int minorRev, int subMinorRev, String versionString) { this(majorRev, minorRev, subMinorRev, -1, (short)(HAS_MAJOR | HAS_MINOR | HAS_SUB), versionString); } - + /** * See {@link VersionNumber#VersionNumber(String)}. */ @@ -63,7 +63,7 @@ public class VersionNumberString extends VersionNumber { super( versionString); strVal = versionString; } - + /** * See {@link VersionNumber#VersionNumber(String, String)}. */ @@ -71,7 +71,7 @@ public class VersionNumberString extends VersionNumber { super( versionString, delim); strVal = versionString; } - + /** * See {@link VersionNumber#VersionNumber(String, java.util.regex.Pattern)}. */ @@ -79,10 +79,10 @@ public class VersionNumberString extends VersionNumber { super( versionString, versionPattern); strVal = versionString; } - + /** Returns the version string this version number is derived from. */ public final String getVersionString() { return strVal; } - + @Override public String toString() { return super.toString() + " ("+strVal+")" ; diff --git a/src/java/com/jogamp/common/util/VersionUtil.java b/src/java/com/jogamp/common/util/VersionUtil.java index 8030e94..c4451ac 100644 --- a/src/java/com/jogamp/common/util/VersionUtil.java +++ b/src/java/com/jogamp/common/util/VersionUtil.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,12 +20,12 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ - + package com.jogamp.common.util; import com.jogamp.common.os.AndroidVersion; @@ -97,16 +97,16 @@ public class VersionUtil { public static Manifest getManifest(ClassLoader cl, String extension) { return getManifest(cl, new String[] { extension } ); } - + /** - * Returns the manifest of the jar which contains one of the specified extensions. + * Returns the manifest of the jar which contains one of the specified extensions. * The provided ClassLoader is used for resource loading. * @param cl A ClassLoader which should find the manifest. * @param extensions The values of many 'Extension-Name's jar-manifest attribute; used to identify the manifest. - * Matching is applied in decreasing order, i.e. first element is favored over the second, etc. + * Matching is applied in decreasing order, i.e. first element is favored over the second, etc. * @return the requested manifest or null when not found. */ - public static Manifest getManifest(ClassLoader cl, String[] extensions) { + public static Manifest getManifest(ClassLoader cl, String[] extensions) { final Manifest[] extManifests = new Manifest[extensions.length]; try { Enumeration<URL> resources = cl.getResources("META-INF/MANIFEST.MF"); diff --git a/src/java/com/jogamp/common/util/awt/AWTEDTExecutor.java b/src/java/com/jogamp/common/util/awt/AWTEDTExecutor.java index a43b738..e98478e 100644 --- a/src/java/com/jogamp/common/util/awt/AWTEDTExecutor.java +++ b/src/java/com/jogamp/common/util/awt/AWTEDTExecutor.java @@ -3,14 +3,14 @@ * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. 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. - * + * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR @@ -20,7 +20,7 @@ * 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. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. @@ -37,12 +37,12 @@ import com.jogamp.common.util.RunnableExecutor; */ public class AWTEDTExecutor implements RunnableExecutor { /** {@link RunnableExecutor} implementation invoking {@link Runnable#run()} - * on the AWT EDT. + * on the AWT EDT. */ public static final AWTEDTExecutor singleton = new AWTEDTExecutor(); private AWTEDTExecutor() {} - + @Override public void invoke(boolean wait, Runnable r) { if(EventQueue.isDispatchThread()) { @@ -76,12 +76,12 @@ public class AWTEDTExecutor implements RunnableExecutor { * <p> * Otherwise the runnable is not executed and <code>false</code> is returned. * </p> - * + * * @param treeLock representing the AWT-tree-lock, i.e. {@link java.awt.Component#getTreeLock()} * @param allowOnNonEDT allow execution on non AWT-EDT in case current thread is not AWT-EDT and the tree-lock is being hold - * @param wait if true method waits until {@link Runnable#run()} is completed, otherwise don't wait. + * @param wait if true method waits until {@link Runnable#run()} is completed, otherwise don't wait. * @param r the {@link Runnable} to be executed. - * @return <code>true</code> if the {@link Runnable} has been issued for execution, otherwise <code>false</code> + * @return <code>true</code> if the {@link Runnable} has been issued for execution, otherwise <code>false</code> */ public boolean invoke(Object treeLock, boolean allowOnNonEDT, boolean wait, Runnable r) { if( EventQueue.isDispatchThread() ) { @@ -93,7 +93,7 @@ public class AWTEDTExecutor implements RunnableExecutor { EventQueue.invokeAndWait(r); } else { EventQueue.invokeLater(r); - } + } } catch (InvocationTargetException e) { throw new RuntimeException(e.getTargetException()); } catch (InterruptedException e) { diff --git a/src/java/com/jogamp/common/util/cache/TempFileCache.java b/src/java/com/jogamp/common/util/cache/TempFileCache.java index 32f5c2a..5898d50 100644 --- a/src/java/com/jogamp/common/util/cache/TempFileCache.java +++ b/src/java/com/jogamp/common/util/cache/TempFileCache.java @@ -43,9 +43,9 @@ public class TempFileCache { // Flag indicating that we got a fatal error in the static initializer. private static boolean staticInitError = false; - + private static final String tmpDirPrefix = "file_cache"; - + // Lifecycle: For one user's JVMs, ClassLoader and time. private static final File tmpBaseDir; @@ -71,12 +71,12 @@ public class TempFileCache { static { // Global Lock ! - synchronized (System.out) { + synchronized (System.out) { // Create / initialize the temp root directory, starting the Reaper // thread to reclaim old installations if necessary. If we get an // exception, set an error code. File _tmpBaseDir = null; - try { + try { _tmpBaseDir = new File(IOUtil.getTempDir(true /* executable */), tmpDirPrefix); _tmpBaseDir = IOUtil.testDir(_tmpBaseDir, true /* create */, false /* executable */); // executable already checked } catch (Exception ex) { @@ -85,12 +85,12 @@ public class TempFileCache { staticInitError = true; } tmpBaseDir = _tmpBaseDir; - + if (DEBUG) { System.err.println("TempFileCache: Static Initialization ---------------------------------------------- OK: "+(!staticInitError)); System.err.println("TempFileCache: Thread: "+Thread.currentThread().getName()+", CL 0x"+Integer.toHexString(TempFileCache.class.getClassLoader().hashCode())+", tempBaseDir "+tmpBaseDir.getAbsolutePath()); } - + if(!staticInitError) { try { initTmpRoot(); @@ -105,15 +105,15 @@ public class TempFileCache { } } } - + /** * Documented way to kick off static initialization * @return true is static initialization was successful */ public static boolean initSingleton() { - return !staticInitError; + return !staticInitError; } - + /** * This method is called by the static initializer to create / initialize * the temp root directory that will hold the temp directories for this @@ -197,7 +197,7 @@ public class TempFileCache { System.clearProperty(tmpRootPropName); } } - + if (tmpRootPropValue == null) { // Create ${tmpbase}/jlnNNNN.tmp then lock the file File tmpFile = File.createTempFile("jln", ".tmp", tmpBaseDir); @@ -413,7 +413,7 @@ public class TempFileCache { System.err.println("TempFileCache: new TempFileCache() --------------------- (static ok: "+(!staticInitError)+")"); System.err.println("TempFileCache: Thread: "+Thread.currentThread().getName()+", CL 0x"+Integer.toHexString(TempFileCache.class.getClassLoader().hashCode())+", this 0x"+Integer.toHexString(hashCode())); } - if(!staticInitError) { + if(!staticInitError) { try { createTmpDir(); } catch (Exception ex) { @@ -424,16 +424,16 @@ public class TempFileCache { if (DEBUG) { System.err.println("TempFileCache: tempDir "+individualTmpDir+" (ok: "+(!initError)+")"); System.err.println("----------------------------------------------------------"); - } + } } - + /** Delete the <code>individualTmpDir</code> recursively and remove it's reference. */ public void destroy() { if (DEBUG) { System.err.println("TempFileCache: destroy() --------------------- (static ok: "+(!staticInitError)+")"); System.err.println("TempFileCache: Thread: "+Thread.currentThread().getName()+", CL 0x"+Integer.toHexString(TempFileCache.class.getClassLoader().hashCode())+", this 0x"+Integer.toHexString(hashCode())); } - if(!staticInitError) { + if(!staticInitError) { try { removeAll(individualTmpDir); } catch (Exception ex) { @@ -443,26 +443,26 @@ public class TempFileCache { individualTmpDir = null; if (DEBUG) { System.err.println("TempFileCache: destroy() END"); - } + } } - + /** * @return true is static and object initialization was successful */ public boolean isValid() { return !staticInitError && !initError; } - + /** * Base temp directory used by TempFileCache. - * - * <p> + * + * <p> * Lifecycle: For one user's JVMs, ClassLoader and time. * </p> - * + * * This is set to: * <pre> * ${java.io.tmpdir}/tmpDirPrefix * </pre> - * + * * @return */ public File getBaseDir() { return tmpBaseDir; } @@ -481,18 +481,18 @@ public class TempFileCache { * * <p> * Use Case: Per ClassLoader files, eg. native libraries. - * </p> + * </p> * * <p> * Old temp directories are cleaned up the next time a JVM is launched that * uses TempFileCache. * </p> * - * + * * @return */ public File getRootDir() { return tmpRootDir; } - + /** * Temporary directory for individual files (eg. native libraries of one ClassLoader instance). * The directory name is: @@ -508,12 +508,12 @@ public class TempFileCache { * where jlnMMMMM is the unique filename created by File.createTempFile() * without the ".tmp" extension. * - * + * * @return */ public File getTempDir() { return individualTmpDir; } - - + + /** * Create the temp directory in tmpRootDir. To do this, we create a temp * file with a ".tmp" extension, and then create a directory of the diff --git a/src/java/com/jogamp/common/util/cache/TempJarCache.java b/src/java/com/jogamp/common/util/cache/TempJarCache.java index ecf6e56..48d8081 100644 --- a/src/java/com/jogamp/common/util/cache/TempJarCache.java +++ b/src/java/com/jogamp/common/util/cache/TempJarCache.java @@ -45,7 +45,7 @@ import com.jogamp.common.util.SecurityUtil; public class TempJarCache { private static final boolean DEBUG = Debug.debug("TempJarCache"); - + // A HashMap of native libraries that can be loaded with System.load() // The key is the string name of the library as passed into the loadLibrary // call; it is the file name without the directory or the platform-dependent @@ -55,8 +55,8 @@ public class TempJarCache { public enum LoadState { LOOKED_UP, LOADED; - - public boolean compliesWith(LoadState o2) { + + public boolean compliesWith(LoadState o2) { return null != o2 ? compareTo(o2) >= 0 : false; } } @@ -66,20 +66,20 @@ public class TempJarCache { } return has.compliesWith(exp); } - + // Set of jar files added private static Map<URI, LoadState> nativeLibJars; private static Map<URI, LoadState> classFileJars; private static Map<URI, LoadState> resourceFileJars; private static TempFileCache tmpFileCache; - + private static boolean staticInitError = false; private static volatile boolean isInit = false; - + /** * Documented way to kick off static initialization. - * + * * @return true is static initialization was successful */ public static boolean initSingleton() { @@ -88,12 +88,12 @@ public class TempJarCache { if (!isInit) { isInit = true; staticInitError = !TempFileCache.initSingleton(); - + if(!staticInitError) { tmpFileCache = new TempFileCache(); - staticInitError = !tmpFileCache.isValid(); + staticInitError = !tmpFileCache.isValid(); } - + if(!staticInitError) { // Initialize the collections of resources nativeLibMap = new HashMap<String, String>(); @@ -109,20 +109,20 @@ public class TempJarCache { } return !staticInitError; } - + /** * This is <b>not recommended</b> since the JNI libraries may still be * in use by the ClassLoader they are loaded via {@link System#load(String)}. * </p> * <p> - * In JogAmp, JNI native libraries loaded and registered by {@link JNILibLoaderBase} - * derivations, where the native JARs might be loaded via {@link JNILibLoaderBase#addNativeJarLibs(Class, String) }. + * In JogAmp, JNI native libraries loaded and registered by {@link JNILibLoaderBase} + * derivations, where the native JARs might be loaded via {@link JNILibLoaderBase#addNativeJarLibs(Class, String) }. * </p> * <p> * The only valid use case to shutdown the TempJarCache is at bootstrapping, * i.e. when no native library is guaranteed to be loaded. This could be useful * if bootstrapping needs to find the proper native library type. - * </p> + * </p> * public static void shutdown() { if (isInit) { // volatile: ok @@ -141,7 +141,7 @@ public class TempJarCache { classFileJars = null; resourceFileJars.clear(); resourceFileJars = null; - + tmpFileCache.destroy(); tmpFileCache = null; } @@ -149,32 +149,32 @@ public class TempJarCache { } } } */ - + /** * @return true if this class has been properly initialized, ie. is in use, otherwise false. */ public static boolean isInitialized() { return isInit && !staticInitError; } - + /* package */ static void checkInitialized() { if(!isInit) { throw new RuntimeException("initSingleton() has to be called first."); } } - + public static TempFileCache getTempFileCache() { checkInitialized(); return tmpFileCache; } - + public synchronized static boolean checkNativeLibs(URI jarURI, LoadState exp) throws IOException { checkInitialized(); if(null == jarURI) { throw new IllegalArgumentException("jarURI is null"); } return testLoadState(nativeLibJars.get(jarURI), exp); - } + } public synchronized static boolean checkClasses(URI jarURI, LoadState exp) throws IOException { checkInitialized(); @@ -182,7 +182,7 @@ public class TempJarCache { throw new IllegalArgumentException("jarURI is null"); } return testLoadState(classFileJars.get(jarURI), exp); - } + } public synchronized static boolean checkResources(URI jarURI, LoadState exp) throws IOException { checkInitialized(); @@ -191,29 +191,29 @@ public class TempJarCache { } return testLoadState(resourceFileJars.get(jarURI), exp); } - + /** * Adds native libraries, if not yet added. - * - * @param certClass if class is certified, the JarFile entries needs to have the same certificate + * + * @param certClass if class is certified, the JarFile entries needs to have the same certificate * @param jarURI * @param nativeLibraryPath if not null, only extracts native libraries within this path. * @return true if native libraries were added or previously loaded from given jarURI, otherwise false * @throws IOException if the <code>jarURI</code> could not be loaded or a previous load attempt failed * @throws SecurityException - * @throws URISyntaxException - * @throws IllegalArgumentException + * @throws URISyntaxException + * @throws IllegalArgumentException */ - public synchronized static final boolean addNativeLibs(Class<?> certClass, URI jarURI, String nativeLibraryPath) throws IOException, SecurityException, IllegalArgumentException, URISyntaxException { + public synchronized static final boolean addNativeLibs(Class<?> certClass, URI jarURI, String nativeLibraryPath) throws IOException, SecurityException, IllegalArgumentException, URISyntaxException { final LoadState nativeLibJarsLS = nativeLibJars.get(jarURI); - if( !testLoadState(nativeLibJarsLS, LoadState.LOOKED_UP) ) { + if( !testLoadState(nativeLibJarsLS, LoadState.LOOKED_UP) ) { nativeLibJars.put(jarURI, LoadState.LOOKED_UP); final JarFile jarFile = JarUtil.getJarFile(jarURI); if(DEBUG) { System.err.println("TempJarCache: addNativeLibs: "+jarURI+": nativeJar "+jarFile.getName()+" (NEW)"); } validateCertificates(certClass, jarFile); - final int num = JarUtil.extract(tmpFileCache.getTempDir(), nativeLibMap, jarFile, nativeLibraryPath, true, false, false); + final int num = JarUtil.extract(tmpFileCache.getTempDir(), nativeLibMap, jarFile, nativeLibraryPath, true, false, false); nativeLibJars.put(jarURI, LoadState.LOADED); return num > 0; } else if( testLoadState(nativeLibJarsLS, LoadState.LOADED) ) { @@ -224,78 +224,78 @@ public class TempJarCache { } throw new IOException("TempJarCache: addNativeLibs: "+jarURI+", previous load attempt failed"); } - + /** * Adds native classes, if not yet added. - * + * * TODO class access pending * needs Classloader.defineClass(..) access, ie. own derivation - will do when needed .. - * - * @param certClass if class is certified, the JarFile entries needs to have the same certificate + * + * @param certClass if class is certified, the JarFile entries needs to have the same certificate * @param jarURI * @throws IOException if the <code>jarURI</code> could not be loaded or a previous load attempt failed * @throws SecurityException - * @throws URISyntaxException - * @throws IllegalArgumentException + * @throws URISyntaxException + * @throws IllegalArgumentException */ public synchronized static final void addClasses(Class<?> certClass, URI jarURI) throws IOException, SecurityException, IllegalArgumentException, URISyntaxException { final LoadState classFileJarsLS = classFileJars.get(jarURI); - if( !testLoadState(classFileJarsLS, LoadState.LOOKED_UP) ) { + if( !testLoadState(classFileJarsLS, LoadState.LOOKED_UP) ) { classFileJars.put(jarURI, LoadState.LOOKED_UP); final JarFile jarFile = JarUtil.getJarFile(jarURI); if(DEBUG) { System.err.println("TempJarCache: addClasses: "+jarURI+": nativeJar "+jarFile.getName()); } validateCertificates(certClass, jarFile); - JarUtil.extract(tmpFileCache.getTempDir(), null, jarFile, - null /* nativeLibraryPath */, false, true, false); + JarUtil.extract(tmpFileCache.getTempDir(), null, jarFile, + null /* nativeLibraryPath */, false, true, false); classFileJars.put(jarURI, LoadState.LOADED); } else if( !testLoadState(classFileJarsLS, LoadState.LOADED) ) { throw new IOException("TempJarCache: addClasses: "+jarURI+", previous load attempt failed"); } } - + /** * Adds native resources, if not yet added. - * - * @param certClass if class is certified, the JarFile entries needs to have the same certificate + * + * @param certClass if class is certified, the JarFile entries needs to have the same certificate * @param jarURI * @return * @throws IOException if the <code>jarURI</code> could not be loaded or a previous load attempt failed * @throws SecurityException - * @throws URISyntaxException - * @throws IllegalArgumentException + * @throws URISyntaxException + * @throws IllegalArgumentException */ - public synchronized static final void addResources(Class<?> certClass, URI jarURI) throws IOException, SecurityException, IllegalArgumentException, URISyntaxException { + public synchronized static final void addResources(Class<?> certClass, URI jarURI) throws IOException, SecurityException, IllegalArgumentException, URISyntaxException { final LoadState resourceFileJarsLS = resourceFileJars.get(jarURI); - if( !testLoadState(resourceFileJarsLS, LoadState.LOOKED_UP) ) { + if( !testLoadState(resourceFileJarsLS, LoadState.LOOKED_UP) ) { resourceFileJars.put(jarURI, LoadState.LOOKED_UP); final JarFile jarFile = JarUtil.getJarFile(jarURI); if(DEBUG) { System.err.println("TempJarCache: addResources: "+jarURI+": nativeJar "+jarFile.getName()); } validateCertificates(certClass, jarFile); - JarUtil.extract(tmpFileCache.getTempDir(), null, jarFile, - null /* nativeLibraryPath */, false, false, true); + JarUtil.extract(tmpFileCache.getTempDir(), null, jarFile, + null /* nativeLibraryPath */, false, false, true); resourceFileJars.put(jarURI, LoadState.LOADED); } else if( !testLoadState(resourceFileJarsLS, LoadState.LOADED) ) { throw new IOException("TempJarCache: addResources: "+jarURI+", previous load attempt failed"); } } - + /** * Adds all types, native libraries, class files and other files (resources) * if not yet added. - * + * * TODO class access pending * needs Classloader.defineClass(..) access, ie. own derivation - will do when needed .. - * - * @param certClass if class is certified, the JarFile entries needs to have the same certificate + * + * @param certClass if class is certified, the JarFile entries needs to have the same certificate * @param jarURI * @throws IOException if the <code>jarURI</code> could not be loaded or a previous load attempt failed * @throws SecurityException - * @throws URISyntaxException - * @throws IllegalArgumentException + * @throws URISyntaxException + * @throws IllegalArgumentException */ public synchronized static final void addAll(Class<?> certClass, URI jarURI) throws IOException, SecurityException, IllegalArgumentException, URISyntaxException { checkInitialized(); @@ -305,14 +305,14 @@ public class TempJarCache { final LoadState nativeLibJarsLS = nativeLibJars.get(jarURI); final LoadState classFileJarsLS = classFileJars.get(jarURI); final LoadState resourceFileJarsLS = resourceFileJars.get(jarURI); - if( !testLoadState(nativeLibJarsLS, LoadState.LOOKED_UP) || - !testLoadState(classFileJarsLS, LoadState.LOOKED_UP) || + if( !testLoadState(nativeLibJarsLS, LoadState.LOOKED_UP) || + !testLoadState(classFileJarsLS, LoadState.LOOKED_UP) || !testLoadState(resourceFileJarsLS, LoadState.LOOKED_UP) ) { - + final boolean extractNativeLibraries = !testLoadState(nativeLibJarsLS, LoadState.LOADED); final boolean extractClassFiles = !testLoadState(classFileJarsLS, LoadState.LOADED); final boolean extractOtherFiles = !testLoadState(resourceFileJarsLS, LoadState.LOOKED_UP); - + // mark looked-up (those who are not loaded) if(extractNativeLibraries) { nativeLibJars.put(jarURI, LoadState.LOOKED_UP); @@ -323,15 +323,15 @@ public class TempJarCache { if(extractOtherFiles) { resourceFileJars.put(jarURI, LoadState.LOOKED_UP); } - + final JarFile jarFile = JarUtil.getJarFile(jarURI); if(DEBUG) { System.err.println("TempJarCache: addAll: "+jarURI+": nativeJar "+jarFile.getName()); } validateCertificates(certClass, jarFile); - JarUtil.extract(tmpFileCache.getTempDir(), nativeLibMap, jarFile, + JarUtil.extract(tmpFileCache.getTempDir(), nativeLibMap, jarFile, null /* nativeLibraryPath */, extractNativeLibraries, extractClassFiles, extractOtherFiles); - + // mark loaded (those were just loaded) if(extractNativeLibraries) { nativeLibJars.put(jarURI, LoadState.LOADED); @@ -342,20 +342,20 @@ public class TempJarCache { if(extractOtherFiles) { resourceFileJars.put(jarURI, LoadState.LOADED); } - } else if( !testLoadState(nativeLibJarsLS, LoadState.LOADED) || - !testLoadState(classFileJarsLS, LoadState.LOADED) || + } else if( !testLoadState(nativeLibJarsLS, LoadState.LOADED) || + !testLoadState(classFileJarsLS, LoadState.LOADED) || !testLoadState(resourceFileJarsLS, LoadState.LOADED) ) { - throw new IOException("TempJarCache: addAll: "+jarURI+", previous load attempt failed"); + throw new IOException("TempJarCache: addAll: "+jarURI+", previous load attempt failed"); } } - + public synchronized static final String findLibrary(String libName) { checkInitialized(); // try with mapped library basename first String path = nativeLibMap.get(libName); if(null == path) { // if valid library name, try absolute path in temp-dir - if(null != NativeLibrary.isValidNativeLibraryName(libName, false)) { + if(null != NativeLibrary.isValidNativeLibraryName(libName, false)) { final File f = new File(tmpFileCache.getTempDir(), libName); if(f.exists()) { path = f.getAbsolutePath(); @@ -364,9 +364,9 @@ public class TempJarCache { } return path; } - + /** TODO class access pending - * needs Classloader.defineClass(..) access, ie. own derivation - will do when needed .. + * needs Classloader.defineClass(..) access, ie. own derivation - will do when needed .. public static Class<?> findClass(String name, ClassLoader cl) throws IOException, ClassFormatError { checkInitialized(); final File f = new File(nativeTmpFileCache.getTempDir(), IOUtil.getClassFileName(name)); @@ -379,7 +379,7 @@ public class TempJarCache { } return null; } */ - + public synchronized static final String findResource(String name) { checkInitialized(); final File f = new File(tmpFileCache.getTempDir(), name); @@ -388,7 +388,7 @@ public class TempJarCache { } return null; } - + public synchronized static final URI getResource(String name) throws URISyntaxException { checkInitialized(); final File f = new File(tmpFileCache.getTempDir(), name); @@ -397,7 +397,7 @@ public class TempJarCache { } return null; } - + private static void validateCertificates(Class<?> certClass, JarFile jarFile) throws IOException, SecurityException { if(null == certClass) { throw new IllegalArgumentException("certClass is null"); @@ -411,9 +411,9 @@ public class TempJarCache { JarUtil.validateCertificates(rootCerts, jarFile); if(DEBUG) { System.err.println("TempJarCache: validateCertificates: OK - Matching rootCerts in given class "+certClass.getName()+", nativeJar "+jarFile.getName()); - } + } } else if(DEBUG) { System.err.println("TempJarCache: validateCertificates: OK - No rootCerts in given class "+certClass.getName()+", nativeJar "+jarFile.getName()); } - } + } } diff --git a/src/java/com/jogamp/common/util/locks/Lock.java b/src/java/com/jogamp/common/util/locks/Lock.java index df645ed..5130876 100644 --- a/src/java/com/jogamp/common/util/locks/Lock.java +++ b/src/java/com/jogamp/common/util/locks/Lock.java @@ -43,8 +43,8 @@ public interface Lock { /** The default {@link #TIMEOUT} value, of {@value} ms */ public static final long DEFAULT_TIMEOUT = 5000; // 5s default timeout - - /** + + /** * The <code>TIMEOUT</code> for {@link #lock()} in ms, * defaults to {@link #DEFAULT_TIMEOUT}. * <p> @@ -78,7 +78,7 @@ public interface Lock { * @throws RuntimeException in case the lock is not acquired by this thread. */ void unlock() throws RuntimeException; - + /** Query if locked */ boolean isLocked(); } diff --git a/src/java/com/jogamp/common/util/locks/LockFactory.java b/src/java/com/jogamp/common/util/locks/LockFactory.java index bb2d5f4..e1ec2d7 100644 --- a/src/java/com/jogamp/common/util/locks/LockFactory.java +++ b/src/java/com/jogamp/common/util/locks/LockFactory.java @@ -35,25 +35,25 @@ import jogamp.common.util.locks.RecursiveThreadGroupLockImpl01Unfairish; public class LockFactory { public enum ImplType { - Int01(0), Java5(1), Int02ThreadGroup(2); - + Int01(0), Java5(1), Int02ThreadGroup(2); + public final int id; ImplType(int id){ this.id = id; } - } - + } + /** default is ImplType.Int01, unfair'ish (fastest w/ least deviation) */ public static RecursiveLock createRecursiveLock() { return new RecursiveLockImpl01Unfairish(); } - + /** default is ImplType.Int02ThreadGroup, unfair'ish (fastest w/ least deviation) */ public static RecursiveThreadGroupLock createRecursiveThreadGroupLock() { return new RecursiveThreadGroupLockImpl01Unfairish(); } - + public static RecursiveLock createRecursiveLock(ImplType t, boolean fair) { switch(t) { case Int01: @@ -65,5 +65,5 @@ public class LockFactory { } throw new InternalError("XXX"); } - + } diff --git a/src/java/com/jogamp/common/util/locks/RecursiveLock.java b/src/java/com/jogamp/common/util/locks/RecursiveLock.java index 3e0a873..c56a5ef 100644 --- a/src/java/com/jogamp/common/util/locks/RecursiveLock.java +++ b/src/java/com/jogamp/common/util/locks/RecursiveLock.java @@ -32,7 +32,7 @@ package com.jogamp.common.util.locks; * Reentrance capable locking toolkit. */ public interface RecursiveLock extends ThreadLock { - /** + /** * Return the number of locks issued to this lock by the same thread. * <ul> * <li>A hold count of 0 identifies this lock as unlocked.</li> diff --git a/src/java/com/jogamp/common/util/locks/RecursiveThreadGroupLock.java b/src/java/com/jogamp/common/util/locks/RecursiveThreadGroupLock.java index 626199f..a23c320 100644 --- a/src/java/com/jogamp/common/util/locks/RecursiveThreadGroupLock.java +++ b/src/java/com/jogamp/common/util/locks/RecursiveThreadGroupLock.java @@ -34,67 +34,67 @@ package com.jogamp.common.util.locks; * </p> */ public interface RecursiveThreadGroupLock extends RecursiveLock { - /** - * Returns true if the current thread is the original lock owner, ie. + /** + * Returns true if the current thread is the original lock owner, ie. * successfully claimed this lock the first time, ie. {@link #getHoldCount()} == 1. */ boolean isOriginalOwner(); - - /** - * Returns true if the passed thread is the original lock owner, ie. + + /** + * Returns true if the passed thread is the original lock owner, ie. * successfully claimed this lock the first time, ie. {@link #getHoldCount()} == 1. */ boolean isOriginalOwner(Thread thread); - - /** + + /** * Add a thread to the list of additional lock owners, which enables them to recursively claim this lock. * <p> * The caller must hold this lock and be the original lock owner, see {@link #isOriginalOwner()}. * </p> * <p> - * If the original owner releases this lock via {@link #unlock()} + * If the original owner releases this lock via {@link #unlock()} * all additional lock owners are released as well. * This ensures consistency of spawn off additional lock owner threads and it's release. - * </p> + * </p> * Use case: * <pre> * Thread2 thread2 = new Thread2(); - * + * * Thread1 { - * + * * // Claim this lock and become the original lock owner. * lock.lock(); - * + * * try { - * + * * // Allow Thread2 to claim the lock, ie. make thread2 an additional lock owner * addOwner(thread2); - * + * * // Start thread2 * thread2.start(); - * + * * // Wait until thread2 has finished requiring this lock, but keep thread2 running - * while(!thread2.waitForResult()) sleep(); - * + * while(!thread2.waitForResult()) sleep(); + * * // Optional: Only if sure that this thread doesn't hold the lock anymore, - * // otherwise just release the lock via unlock(). + * // otherwise just release the lock via unlock(). * removeOwner(thread2); - * + * * } finally { - * + * * // Release this lock and remove all additional lock owners. * // Implicit wait until thread2 gets off the lock. * lock.unlock(); - * + * * } - * + * * }.start(); * </pre> - * - * @param t the thread to be added to the list of additional owning threads + * + * @param t the thread to be added to the list of additional owning threads * @throws RuntimeException if the current thread does not hold the lock. * @throws IllegalArgumentException if the passed thread is the lock owner or already added. - * + * * @see #removeOwner(Thread) * @see #unlock() * @see #lock() @@ -109,31 +109,31 @@ public interface RecursiveThreadGroupLock extends RecursiveLock { * <p> * Only use this method if sure that the thread doesn't hold the lock anymore. * </p> - * - * @param t the thread to be removed from the list of additional owning threads + * + * @param t the thread to be removed from the list of additional owning threads * @throws RuntimeException if the current thread does not hold the lock. * @throws IllegalArgumentException if the passed thread is not added by {@link #addOwner(Thread)} */ void removeOwner(Thread t) throws RuntimeException, IllegalArgumentException; - + /** * <p> * Wait's until all additional owners released this lock before releasing it. * </p> - * + * * {@inheritDoc} */ @Override void unlock() throws RuntimeException; - + /** * <p> * Wait's until all additional owners released this lock before releasing it. * </p> - * + * * {@inheritDoc} */ @Override - void unlock(Runnable taskAfterUnlockBeforeNotify); - + void unlock(Runnable taskAfterUnlockBeforeNotify); + } diff --git a/src/java/com/jogamp/common/util/locks/SingletonInstance.java b/src/java/com/jogamp/common/util/locks/SingletonInstance.java index 825098d..f016d4b 100644 --- a/src/java/com/jogamp/common/util/locks/SingletonInstance.java +++ b/src/java/com/jogamp/common/util/locks/SingletonInstance.java @@ -44,7 +44,7 @@ public abstract class SingletonInstance implements Lock { public static SingletonInstance createFileLock(long poll_ms, File lockFile) { return new SingletonInstanceFileLock(poll_ms, lockFile); } - + /** * A user shall use <b>ephemeral ports</b>: * <ul> @@ -54,23 +54,23 @@ public abstract class SingletonInstance implements Lock { * <li>FreeBSD < 4.6 and BSD use ports 1024 through 4999.</li> * <li>Microsoft Windows operating systems through Server 2003 use the range 1025 to 5000</li> * <li>Windows Vista, Windows 7, and Server 2008 use the IANA range.</li> - * </ul> + * </ul> * @param pollPeriod - * @param portNumber to be used for this single instance server socket. + * @param portNumber to be used for this single instance server socket. */ public static SingletonInstance createServerSocket(long poll_ms, int portNumber) { return new SingletonInstanceServerSocket(poll_ms, portNumber); } - + protected SingletonInstance(long poll_ms) { this.poll_ms = Math.max(10, poll_ms); } - + public final long getPollPeriod() { return poll_ms; } public abstract String getName(); @Override public final String toString() { return getName(); } - + @Override public synchronized void lock() throws RuntimeException { try { @@ -99,7 +99,7 @@ public abstract class SingletonInstance implements Lock { if( DEBUG ) { final long t2 = System.currentTimeMillis(); System.err.println(infoPrefix(t2)+" +++ "+getName()+" - Locked within "+(t2-t0)+" ms, "+(i+1)+" attempts"); - } + } return true; } if( DEBUG && 0==i ) { @@ -118,9 +118,9 @@ public abstract class SingletonInstance implements Lock { System.err.println(infoPrefix(t2)+" +++ EEE (2) "+getName()+" - couldn't get lock within "+(t2-t0)+" ms, "+i+" attempts"); } return false; - } + } protected abstract boolean tryLockImpl(); - + @Override public void unlock() throws RuntimeException { final long t0 = System.currentTimeMillis(); @@ -145,7 +145,7 @@ public abstract class SingletonInstance implements Lock { protected String infoPrefix() { return infoPrefix(System.currentTimeMillis()); } - + private final long poll_ms; private boolean locked = false; } diff --git a/src/java/com/jogamp/common/util/locks/ThreadLock.java b/src/java/com/jogamp/common/util/locks/ThreadLock.java index 65260bc..26e7475 100644 --- a/src/java/com/jogamp/common/util/locks/ThreadLock.java +++ b/src/java/com/jogamp/common/util/locks/ThreadLock.java @@ -33,27 +33,27 @@ package com.jogamp.common.util.locks; */ public interface ThreadLock extends Lock { - /** Query whether the lock is hold by the a thread other than the current thread. */ + /** Query whether the lock is hold by the a thread other than the current thread. */ boolean isLockedByOtherThread(); - /** Query whether the lock is hold by the given thread. */ + /** Query whether the lock is hold by the given thread. */ boolean isOwner(Thread thread); - + /** * @return the Thread owning this lock if locked, otherwise null */ Thread getOwner(); /** - * @throws RuntimeException if current thread does not hold the lock + * @throws RuntimeException if current thread does not hold the lock */ void validateLocked() throws RuntimeException; - + /** * Execute the {@link Runnable Runnable taskAfterUnlockBeforeNotify} while holding the exclusive lock. * <p> * Then release the lock. - * </p> + * </p> */ - void unlock(Runnable taskAfterUnlockBeforeNotify); + void unlock(Runnable taskAfterUnlockBeforeNotify); } |