summaryrefslogtreecommitdiffstats
path: root/src/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java')
-rw-r--r--src/java/com/jogamp/common/GlueGenVersion.java2
-rw-r--r--src/java/com/jogamp/common/jvm/JNILibLoaderBase.java2
-rwxr-xr-xsrc/java/com/jogamp/common/os/NativeLibrary.java13
-rw-r--r--src/java/com/jogamp/common/util/ArrayHashSet.java2
-rw-r--r--src/java/com/jogamp/common/util/IntIntHashMap.java142
-rw-r--r--src/java/com/jogamp/common/util/JogampVersion.java17
-rw-r--r--src/java/com/jogamp/common/util/ReflectionUtil.java27
-rw-r--r--src/java/com/jogamp/common/util/RunnableTask.java3
-rw-r--r--src/java/com/jogamp/common/util/VersionNumber.java3
-rw-r--r--src/java/com/jogamp/common/util/VersionUtil.java12
-rw-r--r--src/java/com/jogamp/common/util/locks/RecursiveLock.java2
-rwxr-xr-xsrc/java/com/jogamp/gluegen/runtime/NativeLibLoader.java2
12 files changed, 173 insertions, 54 deletions
diff --git a/src/java/com/jogamp/common/GlueGenVersion.java b/src/java/com/jogamp/common/GlueGenVersion.java
index 87c9d3e..c3dcc75 100644
--- a/src/java/com/jogamp/common/GlueGenVersion.java
+++ b/src/java/com/jogamp/common/GlueGenVersion.java
@@ -41,7 +41,7 @@ public class GlueGenVersion extends JogampVersion {
}
public static GlueGenVersion getInstance() {
- if(null == jogampCommonVersionInfo) {
+ if(null == jogampCommonVersionInfo) { // volatile: ok
synchronized(GlueGenVersion.class) {
if( null == jogampCommonVersionInfo ) {
final String packageName = "com.jogamp.common";
diff --git a/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java b/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
index cbc5959..2ad0504 100644
--- a/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
+++ b/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
@@ -39,8 +39,6 @@
package com.jogamp.common.jvm;
-// FIXME: refactor Java SE dependencies
-//import java.awt.Toolkit;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.AccessController;
diff --git a/src/java/com/jogamp/common/os/NativeLibrary.java b/src/java/com/jogamp/common/os/NativeLibrary.java
index 2c7e596..558aa3e 100755
--- a/src/java/com/jogamp/common/os/NativeLibrary.java
+++ b/src/java/com/jogamp/common/os/NativeLibrary.java
@@ -252,14 +252,15 @@ public class NativeLibrary implements DynamicLookupHelper {
ClassLoader loader) {
List paths = new ArrayList();
String libName = selectName(windowsLibName, unixLibName, macOSXLibName);
- if (libName == null)
+ if (libName == null) {
return paths;
+ }
// Allow user's full path specification to override our building of paths
File file = new File(libName);
if (file.isAbsolute()) {
- paths.add(libName);
- return paths;
+ paths.add(libName);
+ return paths;
}
String[] baseNames = buildNames(libName);
@@ -314,9 +315,7 @@ public class NativeLibrary implements DynamicLookupHelper {
if (!searchSystemPathFirst) {
// Add just the library names to use the OS's search algorithm
- for (int i = 0; i < baseNames.length; i++) {
- paths.add(baseNames[i]);
- }
+ paths.addAll(Arrays.asList(baseNames));
}
return paths;
@@ -425,7 +424,7 @@ public class NativeLibrary implements DynamicLookupHelper {
private static volatile boolean loadedDynLinkNativeLib;
public static void ensureNativeLibLoaded() {
- if (!loadedDynLinkNativeLib) {
+ if (!loadedDynLinkNativeLib) { // volatile: ok
synchronized (NativeLibrary.class) {
if (!loadedDynLinkNativeLib) {
loadedDynLinkNativeLib = true;
diff --git a/src/java/com/jogamp/common/util/ArrayHashSet.java b/src/java/com/jogamp/common/util/ArrayHashSet.java
index 0840cde..8266b50 100644
--- a/src/java/com/jogamp/common/util/ArrayHashSet.java
+++ b/src/java/com/jogamp/common/util/ArrayHashSet.java
@@ -34,6 +34,8 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Hashed ArrayList implementation of the List and Collection interface.
diff --git a/src/java/com/jogamp/common/util/IntIntHashMap.java b/src/java/com/jogamp/common/util/IntIntHashMap.java
index e18468b..487914b 100644
--- a/src/java/com/jogamp/common/util/IntIntHashMap.java
+++ b/src/java/com/jogamp/common/util/IntIntHashMap.java
@@ -31,6 +31,10 @@
*/
package com.jogamp.common.util;
+import com.jogamp.common.JogampRuntimeException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
@@ -45,6 +49,7 @@ import java.util.Iterator;
*
* @author Michael Bien
* @author Simon Goller
+ * @author Sven Gothel
*
* @see IntObjectHashMap
* @see IntLongHashMap
@@ -52,7 +57,7 @@ import java.util.Iterator;
* @see LongLongHashMap
* @see LongIntHashMap
*/
-public class /*name*/IntIntHashMap/*name*/ implements Iterable {
+public class /*name*/IntIntHashMap/*name*/ implements Cloneable, Iterable {
private final float loadFactor;
@@ -63,7 +68,33 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
private int capacity;
private int threshold;
private /*value*/int/*value*/ keyNotFoundValue = /*null*/-1/*null*/;
-
+
+ private static final boolean isPrimitive;
+ private static final Constructor entryConstructor;
+ private static final Method equalsMethod;
+
+ static {
+ final Class valueClazz = /*value*/int/*value*/.class;
+ final Class keyClazz = /*key*/int/*key*/.class;
+
+ isPrimitive = valueClazz.isPrimitive();
+
+ Constructor c = null;
+ Method m = null;
+ if(!isPrimitive) {
+ c = ReflectionUtil.getConstructor(Entry.class,
+ new Class[] { keyClazz, valueClazz, Entry.class } );
+
+ try {
+ m = valueClazz.getDeclaredMethod("equals", Object.class);
+ } catch (NoSuchMethodException ex) {
+ throw new JogampRuntimeException("Class "+valueClazz+" doesn't support equals(Object)");
+ }
+ }
+ entryConstructor = c;
+ equalsMethod = m;
+ }
+
public /*name*/IntIntHashMap/*name*/() {
this(16, 0.75f);
}
@@ -92,12 +123,71 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
this.mask = capacity - 1;
}
+ private /*name*/IntIntHashMap/*name*/(float loadFactor, int table_size, int size,
+ 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;
+ }
+
+ /**
+ * 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,
+ keyNotFoundValue);
+
+ for(int i=table.length-1; i>=0; i--) {
+ // single linked list -> ArrayList
+ final ArrayList<Entry> entries = new ArrayList();
+ Entry se = table[i];
+ while(null != se) {
+ entries.add(se);
+ se = se.next;
+ }
+ // clone ArrayList -> single linked list (bwd)
+ Entry de_next = null;
+ for(int j=entries.size()-1; j>=0; j--) {
+ se = entries.get(j);
+ if( isPrimitive ) {
+ de_next = new Entry(se.key, se.value, de_next);
+ } else {
+ final Object v = ReflectionUtil.callMethod(se.value, getCloneMethod(se.value));
+ de_next = (Entry) ReflectionUtil.createInstance(entryConstructor, se.key, v, de_next);
+ }
+ }
+ // 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;) {
for (Entry e = t[i]; e != null; e = e.next) {
- if (e.value == value) {
- return true;
+ if( isPrimitive ) {
+ if (e.value == value) {
+ return true;
+ }
+ } else {
+ final Boolean b = (Boolean) ReflectionUtil.callMethod(value, equalsMethod, e.value);
+ if(b.booleanValue()) {
+ return true;
+ }
}
}
}
@@ -138,7 +228,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
*/
// @SuppressWarnings(value="cast")
public /*value*/int/*value*/ put(/*key*/int/*key*/ key, /*value*/int/*value*/ value) {
- Entry[] t = this.table;
+ final Entry[] t = this.table;
int index = (int) (key & mask);
// Check if key already exists.
for (Entry e = t[index]; e != null; e = e.next) {
@@ -154,7 +244,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
if (size++ >= threshold) {
// Rehash.
int newCapacity = 2 * capacity;
- Entry[] newTable = new Entry[newCapacity];
+ final Entry[] newTable = new Entry[newCapacity];
/*key*/int/*key*/ bucketmask = newCapacity - 1;
for (int j = 0; j < t.length; j++) {
Entry e = t[j];
@@ -224,6 +314,13 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
}
/**
+ * Returns the current capacity (buckets) in this map.
+ */
+ public int capacity() {
+ return capacity;
+ }
+
+ /**
* Clears the entire map. The size is 0 after this operation.
*/
public void clear() {
@@ -235,8 +332,8 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
* Returns a new {@link Iterator}.
* Note: this Iterator does not yet support removal of elements.
*/
-// @Override
- public Iterator/*<Entry>*/ iterator() {
+ @Override
+ public Iterator<Entry> iterator() {
return new EntryIterator(table);
}
@@ -264,7 +361,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
return keyNotFoundValue;
}
-// @Override
+ @Override
public String toString() {
// TODO use StringBuilder as soon we are at language level 5
String str = "{";
@@ -279,7 +376,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
return str;
}
- private final static class EntryIterator implements Iterator/*<Entry>*/ {
+ private final static class EntryIterator implements Iterator<Entry> {
private final Entry[] entries;
@@ -292,13 +389,13 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
next();
}
-// @Override
+ @Override
public boolean hasNext() {
return next != null;
}
-// @Override
- public Object next() {
+ @Override
+ public Entry next() {
Entry current = next;
if(current != null && current.next != null) {
@@ -317,7 +414,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
return current;
}
-// @Override
+ @Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -334,12 +431,12 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
private Entry next;
- private Entry(/*key*/int/*key*/ k, /*value*/int/*value*/ v, Entry n) {
+ Entry(/*key*/int/*key*/ k, /*value*/int/*value*/ v, Entry n) {
key = k;
value = v;
next = n;
}
-
+
/**
* Returns the key of this entry.
*/
@@ -361,10 +458,21 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
this.value = value;
}
-// @Override
+ @Override
public String toString() {
return "["+key+":"+value+"]";
}
}
+
+ private static Method getCloneMethod(Object obj) {
+ final Class clazz = obj.getClass();
+ Method m = null;
+ try {
+ m = clazz.getDeclaredMethod("clone");
+ } catch (NoSuchMethodException ex) {
+ throw new JogampRuntimeException("Class "+clazz+" doesn't support clone()", ex);
+ }
+ return m;
+ }
}
diff --git a/src/java/com/jogamp/common/util/JogampVersion.java b/src/java/com/jogamp/common/util/JogampVersion.java
index f7da413..1af86d3 100644
--- a/src/java/com/jogamp/common/util/JogampVersion.java
+++ b/src/java/com/jogamp/common/util/JogampVersion.java
@@ -37,8 +37,8 @@ import java.util.jar.Manifest;
public class JogampVersion {
- public static Attributes.Name IMPLEMENTATION_BRANCH = new Attributes.Name("Implementation-Branch");
- public static Attributes.Name IMPLEMENTATION_COMMIT = new Attributes.Name("Implementation-Commit");
+ public static final Attributes.Name IMPLEMENTATION_BRANCH = new Attributes.Name("Implementation-Branch");
+ public static final Attributes.Name IMPLEMENTATION_COMMIT = new Attributes.Name("Implementation-Commit");
private String packageName;
private Manifest mf;
@@ -54,10 +54,12 @@ public class JogampVersion {
mainAttributeNames = mainAttributes.keySet();
}
+ @Override
public final int hashCode() {
return hash;
}
+ @Override
public final boolean equals(Object o) {
if (o instanceof JogampVersion) {
return mf.equals(((JogampVersion) o).getManifest());
@@ -139,13 +141,13 @@ public class JogampVersion {
return this.getAttribute(Attributes.Name.SPECIFICATION_VERSION);
}
- public final StringBuffer getFullManifestInfo(StringBuffer sb) {
+ public final StringBuilder getFullManifestInfo(StringBuilder sb) {
return VersionUtil.getFullManifestInfo(getManifest(), sb);
}
- public StringBuffer getManifestInfo(StringBuffer sb) {
+ public StringBuilder getManifestInfo(StringBuilder sb) {
if(null==sb) {
- sb = new StringBuffer();
+ sb = new StringBuilder();
}
String nl = Platform.getNewline();
sb.append("Package: ").append(getPackageName()).append(nl);
@@ -163,9 +165,9 @@ public class JogampVersion {
return sb;
}
- public StringBuffer toString(StringBuffer sb) {
+ public StringBuilder toString(StringBuilder sb) {
if(null==sb) {
- sb = new StringBuffer();
+ sb = new StringBuilder();
}
sb.append(VersionUtil.SEPERATOR).append(Platform.getNewline());
@@ -175,6 +177,7 @@ public class JogampVersion {
return sb;
}
+ @Override
public String toString() {
return toString(null).toString();
}
diff --git a/src/java/com/jogamp/common/util/ReflectionUtil.java b/src/java/com/jogamp/common/util/ReflectionUtil.java
index 24aba2f..7617d53 100644
--- a/src/java/com/jogamp/common/util/ReflectionUtil.java
+++ b/src/java/com/jogamp/common/util/ReflectionUtil.java
@@ -105,7 +105,7 @@ public final class ReflectionUtil {
/**
* @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 {
try {
if(null == cstrArgTypes) {
@@ -125,11 +125,11 @@ public final class ReflectionUtil {
/**
* @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(Constructor cstr, Object ... cstrArgs)
throws JogampRuntimeException, RuntimeException
{
try {
- return getConstructor(clazz, cstrArgTypes).newInstance(cstrArgs);
+ return cstr.newInstance(cstrArgs);
} catch (Exception e) {
Throwable t = e;
if (t instanceof InvocationTargetException) {
@@ -141,11 +141,20 @@ public final class ReflectionUtil {
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
- throw new JogampRuntimeException("can not create instance of "+clazz, t);
+ 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)
+ 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;
@@ -228,7 +237,7 @@ public final class ReflectionUtil {
/**
* @throws JogampRuntimeException if the Method can not be found.
*/
- public static final Method getMethod(Class clazz, String methodName, Class[] argTypes)
+ public static final Method getMethod(Class clazz, String methodName, Class ... argTypes)
throws JogampRuntimeException, RuntimeException
{
try {
@@ -259,7 +268,7 @@ public final class ReflectionUtil {
* @throws JogampRuntimeException if call fails
* @throws RuntimeException if call fails
*/
- public static final Object callMethod(Object instance, Method method, Object[] args)
+ public static final Object callMethod(Object instance, Method method, Object ... args)
throws JogampRuntimeException, RuntimeException
{
try {
@@ -288,9 +297,5 @@ public final class ReflectionUtil {
return callMethod(null, getMethod(clazzName, methodName, argTypes, cl), args);
}
- public static String getBaseName(Class clazz) {
- String s = clazz.toString();
- return s.substring(s.lastIndexOf(".")+1);
- }
}
diff --git a/src/java/com/jogamp/common/util/RunnableTask.java b/src/java/com/jogamp/common/util/RunnableTask.java
index d5622b2..3707ce8 100644
--- a/src/java/com/jogamp/common/util/RunnableTask.java
+++ b/src/java/com/jogamp/common/util/RunnableTask.java
@@ -34,7 +34,7 @@ package com.jogamp.common.util;
*/
public class RunnableTask implements Runnable {
Runnable runnable;
- Object notifyObject;
+ final Object notifyObject;
boolean catchExceptions;
Object attachment;
@@ -121,6 +121,7 @@ public class RunnableTask implements Runnable {
public long getDurationInExec() { return ts2 - ts1; }
public long getDurationTotal() { return ts2 - ts0; }
+ @Override
public String toString() {
return "RunnableTask[executed "+isExecuted()+", t2-t0 "+getDurationTotal()+", t2-t1 "+getDurationInExec()+", t1-t0 "+getDurationInQueue()+", throwable "+getThrowable()+", Runnable "+runnable+", Attachment "+attachment+"]";
}
diff --git a/src/java/com/jogamp/common/util/VersionNumber.java b/src/java/com/jogamp/common/util/VersionNumber.java
index f0ba820..7e86e72 100644
--- a/src/java/com/jogamp/common/util/VersionNumber.java
+++ b/src/java/com/jogamp/common/util/VersionNumber.java
@@ -42,6 +42,7 @@ public class VersionNumber implements Comparable {
protected VersionNumber() { }
+ @Override
public final int hashCode() {
// 31 * x == (x << 5) - x
int hash = 31 + major;
@@ -49,6 +50,7 @@ public class VersionNumber implements Comparable {
return ((hash << 5) - hash) + sub;
}
+ @Override
public final boolean equals(Object o) {
return 0 == compareTo(o);
}
@@ -88,6 +90,7 @@ public class VersionNumber implements Comparable {
return sub;
}
+ @Override
public String toString() {
return major + "." + minor + "." + sub ;
}
diff --git a/src/java/com/jogamp/common/util/VersionUtil.java b/src/java/com/jogamp/common/util/VersionUtil.java
index 6868175..632e127 100644
--- a/src/java/com/jogamp/common/util/VersionUtil.java
+++ b/src/java/com/jogamp/common/util/VersionUtil.java
@@ -43,11 +43,11 @@ public class VersionUtil {
public static final String SEPERATOR = "-----------------------------------------------------------------------------------------------------";
/**
- * Appends environment information like OS, JVM and CPU architecture properties to the StringBuffer.
+ * Appends environment information like OS, JVM and CPU architecture properties to the StringBuilder.
*/
- public static StringBuffer getPlatformInfo(StringBuffer sb) {
+ public static StringBuilder getPlatformInfo(StringBuilder sb) {
if(null == sb) {
- sb = new StringBuffer();
+ sb = new StringBuilder();
}
sb.append(SEPERATOR).append(Platform.getNewline());
@@ -73,7 +73,7 @@ public class VersionUtil {
/**
* Prints platform info.
- * @see #getPlatformInfo(java.lang.StringBuffer)
+ * @see #getPlatformInfo(java.lang.StringBuilder)
*/
public static String getPlatformInfo() {
return getPlatformInfo(null).toString();
@@ -102,13 +102,13 @@ public class VersionUtil {
return null;
}
- public static StringBuffer getFullManifestInfo(Manifest mf, StringBuffer sb) {
+ public static StringBuilder getFullManifestInfo(Manifest mf, StringBuilder sb) {
if(null==mf) {
return sb;
}
if(null==sb) {
- sb = new StringBuffer();
+ sb = new StringBuilder();
}
Attributes attr = mf.getMainAttributes();
diff --git a/src/java/com/jogamp/common/util/locks/RecursiveLock.java b/src/java/com/jogamp/common/util/locks/RecursiveLock.java
index 4f8415e..2ff0d9b 100644
--- a/src/java/com/jogamp/common/util/locks/RecursiveLock.java
+++ b/src/java/com/jogamp/common/util/locks/RecursiveLock.java
@@ -50,7 +50,7 @@ public class RecursiveLock implements LockExt {
// flag signaling unlock has woken up a waiting thread
boolean signaled = false;
}
- private SyncData sdata = new SyncData(); // synchronized (flow/mem) mutable access
+ private final SyncData sdata = new SyncData(); // synchronized (flow/mem) mutable access
private static final boolean TRACE_LOCK = Debug.isPropertyDefined("jogamp.debug.Lock.TraceLock", true, AccessController.getContext());
diff --git a/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java b/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java
index 662a059..94ff5d6 100755
--- a/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java
+++ b/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java
@@ -61,7 +61,7 @@ public class NativeLibLoader {
}
public static void loadGlueGenRT() {
- if (!didLoading && loadingEnabled) {
+ if (!didLoading && loadingEnabled) { // volatile: ok
synchronized (NativeLibLoader.class) {
if (!didLoading && loadingEnabled) {
didLoading = true;