public Namespace get(String prefix,
String uri) {
/* Try the java.util.concurrent.ConcurrentHashMap first. */
try {
Class clazz = Class
.forName("java.util.concurrent.ConcurrentHashMap");
Constructor construct = clazz.getConstructor(new Class[] {
Integer.TYPE, Float.TYPE, Integer.TYPE });
cache = (Map) construct.newInstance(new Object[] {new Integer(11),
new Float(0.75f), new Integer(1) });
noPrefixCache = (Map) construct.newInstance(new Object[] {
new Integer(11), new Float(0.75f), new Integer(1) });
} catch (Throwable t1) {
/* Try to use the util.concurrent library (if in classpath) */
try {
Class clazz = Class.forName(CONCURRENTREADERHASHMAP_CLASS);
cache = (Map) clazz.newInstance();
noPrefixCache = (Map) clazz.newInstance();
} catch (Throwable t2) {
/* If previous implementations fail, use internal one */
cache = new ConcurrentReaderHashMap();
noPrefixCache = new ConcurrentReaderHashMap();
}
}
Map uriCache = getURICache(uri);
WeakReference ref = (WeakReference) uriCache.get(prefix);
Namespace answer = null;
if (ref != null) {
answer = (Namespace) ref.get();
}
if (answer == null) {
synchronized (uriCache) {
ref = (WeakReference) uriCache.get(prefix);
if (ref != null) {
answer = (Namespace) ref.get();
}
if (answer == null) {
answer = createNamespace(prefix, uri);
uriCache.put(prefix, new WeakReference(answer));
}
}
}
return answer;
}
|