in subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/SecureAction.java [1004:1072]
private static Object _swapStaticFieldIfNotClass(Class targetClazz,
Class targetType, Class condition, String lockName) throws Exception
{
Object lock = null;
if (lockName != null)
{
try
{
Field lockField =
targetClazz.getDeclaredField(lockName);
lockField.setAccessible(true);
lock = lockField.get(null);
}
catch (NoSuchFieldException ex)
{
}
}
if (lock == null)
{
lock = targetClazz;
}
synchronized (lock)
{
Field[] fields = targetClazz.getDeclaredFields();
Object result = null;
for (int i = 0; (i < fields.length) && (result == null); i++)
{
if (Modifier.isStatic(fields[i].getModifiers()) &&
(fields[i].getType() == targetType))
{
fields[i].setAccessible(true);
result = fields[i].get(null);
if (result != null)
{
if ((condition == null) ||
!result.getClass().getName().equals(condition.getName()))
{
fields[i].set(null, null);
}
}
}
}
if (result != null)
{
if ((condition == null) || !result.getClass().getName().equals(condition.getName()))
{
// reset cache
for (int i = 0; i < fields.length; i++)
{
if (Modifier.isStatic(fields[i].getModifiers()) &&
(fields[i].getType() == Hashtable.class))
{
fields[i].setAccessible(true);
Hashtable cache = (Hashtable) fields[i].get(null);
if (cache != null)
{
cache.clear();
}
}
}
}
return result;
}
}
return null;
}