package org.infinispan.factories;
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Map.Entry;
import java.util.Properties;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
/**
* SecurityActions for the org.infinispan.factories package.
*
* Do not move. Do not change class and method visibility to avoid being called from other
* {@link java.security.CodeSource}s, thus granting privilege escalation to external code.
*
* @author Tristan Tarrant
* @since 7.0
*/
final class SecurityActions {
private static final Log log = LogFactory.getLog(SecurityActions.class);
private static Field findFieldRecursively(Class<?> c, String fieldName) {
Field f = null;
try {
f = c.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
if (!c.equals(Object.class)) f = findFieldRecursively(c.getSuperclass(), fieldName);
}
return f;
}
static void setValue(Object instance, String fieldName, Object value) {
try {
final Field f = findFieldRecursively(instance.getClass(), fieldName);
if (f == null)
throw new NoSuchMethodException("Cannot find field " + fieldName + " on " + instance.getClass() + " or superclasses");
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
f.setAccessible(true);
return null;
}
});
} else {
f.setAccessible(true);
}
f.set(instance, value);
} catch (Exception e) {
log.unableToSetValue(e);
}
}
static void applyProperties(Object o, Properties p) {
for(Entry<Object, Object> entry : p.entrySet()) {
setValue(o, (String) entry.getKey(), entry.getValue());
}
}
}