import java.lang.invoke.MethodHandles.Lookup;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import java.util.Collections;
import java.util.Map;
import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
import org.opendaylight.yangtools.yang.binding.Augmentation;
-import org.opendaylight.yangtools.yang.binding.AugmentationHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final AugmentationFieldGetter DUMMY = new AugmentationFieldGetter() {
@Override
- protected Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
+ Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
return Collections.emptyMap();
}
};
- private static final AugmentationFieldGetter AUGMENTATION_HOLDER_GETTER = new AugmentationFieldGetter() {
- @Override
- @SuppressWarnings({"unchecked", "rawtypes"})
- protected Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
- return (Map) ((AugmentationHolder<?>) input).augmentations();
- }
- };
-
private static final LoadingCache<Class<?>, AugmentationFieldGetter> AUGMENTATION_GETTERS =
CacheBuilder.newBuilder().weakKeys().build(new AugmentationGetterLoader());
* @param input Input Data object, from which augmentations should be extracted
* @return Map of Augmentation class to augmentation
*/
- protected abstract Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(Object input);
+ abstract Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(Object input);
- public static AugmentationFieldGetter getGetter(final Class<? extends Object> clz) {
- if (AugmentationHolder.class.isAssignableFrom(clz)) {
- return AUGMENTATION_HOLDER_GETTER;
- }
+ static AugmentationFieldGetter getGetter(final Class<? extends Object> clz) {
return AUGMENTATION_GETTERS.getUnchecked(clz);
}
public AugmentationFieldGetter load(final Class<?> key) throws IllegalAccessException {
final Field field;
try {
- field = key.getDeclaredField(BindingMapping.AUGMENTATION_FIELD);
- field.setAccessible(true);
- } catch (NoSuchFieldException | SecurityException e) {
+ field = AccessController.doPrivileged((PrivilegedExceptionAction<Field>) () -> {
+ final Field f = key.getDeclaredField(BindingMapping.AUGMENTATION_FIELD);
+ f.setAccessible(true);
+ return f;
+ });
+ } catch (PrivilegedActionException e) {
LOG.warn("Failed to acquire augmentation field {}, ignoring augmentations in class {}",
BindingMapping.AUGMENTATION_FIELD, key, e);
return DUMMY;
@Override
@SuppressWarnings("checkstyle:illegalCatch")
- protected Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
+ Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
try {
return (Map<Class<? extends Augmentation<?>>, Augmentation<?>>) fieldGetter.invokeExact(input);
} catch (Throwable e) {