325 lines
12 KiB
Java
325 lines
12 KiB
Java
|
package o;
|
||
|
|
||
|
import java.lang.reflect.InvocationTargetException;
|
||
|
import java.util.HashSet;
|
||
|
import java.util.Iterator;
|
||
|
import java.util.LinkedList;
|
||
|
import java.util.Map;
|
||
|
import java.util.Set;
|
||
|
import java.util.concurrent.ConcurrentHashMap;
|
||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||
|
import java.util.concurrent.ConcurrentMap;
|
||
|
import java.util.concurrent.CopyOnWriteArraySet;
|
||
|
|
||
|
/* renamed from: o.fNn, reason: case insensitive filesystem */
|
||
|
/* loaded from: classes5.dex */
|
||
|
public class C13001fNn {
|
||
|
public static final String DEFAULT_IDENTIFIER = "default";
|
||
|
private final fNA enforcer;
|
||
|
private final ThreadLocal<ConcurrentLinkedQueue<IeS>> eventsToDispatch;
|
||
|
private final ConcurrentMap<Class<?>, Set<Class<?>>> flattenHierarchyCache;
|
||
|
private final InterfaceC13008fNu handlerFinder;
|
||
|
private final ConcurrentMap<Class<?>, Set<C13005fNr>> handlersByType;
|
||
|
private final String identifier;
|
||
|
private final ThreadLocal<Boolean> isDispatching;
|
||
|
private final ConcurrentMap<Class<?>, C13007fNt> producersByType;
|
||
|
|
||
|
public C13001fNn() {
|
||
|
this(DEFAULT_IDENTIFIER);
|
||
|
}
|
||
|
|
||
|
public C13001fNn(String str) {
|
||
|
this(fNA.a, str);
|
||
|
}
|
||
|
|
||
|
public C13001fNn(fNA fna) {
|
||
|
this(fna, DEFAULT_IDENTIFIER);
|
||
|
}
|
||
|
|
||
|
public C13001fNn(fNA fna, String str) {
|
||
|
this(fna, str, InterfaceC13008fNu.a);
|
||
|
}
|
||
|
|
||
|
C13001fNn(fNA fna, String str, InterfaceC13008fNu interfaceC13008fNu) {
|
||
|
this.handlersByType = new ConcurrentHashMap();
|
||
|
this.producersByType = new ConcurrentHashMap();
|
||
|
this.eventsToDispatch = new ThreadLocal<ConcurrentLinkedQueue<IeS>>(this) { // from class: o.fNn.4
|
||
|
private C13001fNn a;
|
||
|
|
||
|
{
|
||
|
this.a = this;
|
||
|
}
|
||
|
|
||
|
@Override // java.lang.ThreadLocal
|
||
|
protected final /* synthetic */ ConcurrentLinkedQueue<IeS> initialValue() {
|
||
|
return new ConcurrentLinkedQueue<>();
|
||
|
}
|
||
|
};
|
||
|
this.isDispatching = new ThreadLocal<Boolean>(this) { // from class: o.fNn.1
|
||
|
private C13001fNn b;
|
||
|
|
||
|
{
|
||
|
this.b = this;
|
||
|
}
|
||
|
|
||
|
@Override // java.lang.ThreadLocal
|
||
|
protected final /* bridge */ /* synthetic */ Boolean initialValue() {
|
||
|
return Boolean.FALSE;
|
||
|
}
|
||
|
};
|
||
|
this.flattenHierarchyCache = new ConcurrentHashMap();
|
||
|
this.enforcer = fna;
|
||
|
this.identifier = str;
|
||
|
this.handlerFinder = interfaceC13008fNu;
|
||
|
}
|
||
|
|
||
|
public String toString() {
|
||
|
StringBuilder sb = new StringBuilder("[Bus \"");
|
||
|
sb.append(this.identifier);
|
||
|
sb.append("\"]");
|
||
|
return sb.toString();
|
||
|
}
|
||
|
|
||
|
public void register(Object obj) {
|
||
|
Set<C13005fNr> putIfAbsent;
|
||
|
if (obj == null) {
|
||
|
throw new NullPointerException("Object to register must not be null.");
|
||
|
}
|
||
|
this.enforcer.b(this);
|
||
|
Map<Class<?>, C13007fNt> b = this.handlerFinder.b(obj);
|
||
|
for (Class<?> cls : b.keySet()) {
|
||
|
C13007fNt c13007fNt = b.get(cls);
|
||
|
C13007fNt putIfAbsent2 = this.producersByType.putIfAbsent(cls, c13007fNt);
|
||
|
if (putIfAbsent2 != null) {
|
||
|
StringBuilder sb = new StringBuilder("Producer method for type ");
|
||
|
sb.append(cls);
|
||
|
sb.append(" found on type ");
|
||
|
sb.append(c13007fNt.d.getClass());
|
||
|
sb.append(", but already registered by type ");
|
||
|
sb.append(putIfAbsent2.d.getClass());
|
||
|
sb.append(".");
|
||
|
throw new IllegalArgumentException(sb.toString());
|
||
|
}
|
||
|
Set<C13005fNr> set = this.handlersByType.get(cls);
|
||
|
if (set != null && !set.isEmpty()) {
|
||
|
Iterator<C13005fNr> it = set.iterator();
|
||
|
while (it.hasNext()) {
|
||
|
dispatchProducerResultToHandler(it.next(), c13007fNt);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
Map<Class<?>, Set<C13005fNr>> c = this.handlerFinder.c(obj);
|
||
|
for (Class<?> cls2 : c.keySet()) {
|
||
|
Set<C13005fNr> set2 = this.handlersByType.get(cls2);
|
||
|
if (set2 == null && (putIfAbsent = this.handlersByType.putIfAbsent(cls2, (set2 = new CopyOnWriteArraySet<>()))) != null) {
|
||
|
set2 = putIfAbsent;
|
||
|
}
|
||
|
if (!set2.addAll(c.get(cls2))) {
|
||
|
throw new IllegalArgumentException("Object already registered.");
|
||
|
}
|
||
|
}
|
||
|
for (Map.Entry<Class<?>, Set<C13005fNr>> entry : c.entrySet()) {
|
||
|
C13007fNt c13007fNt2 = this.producersByType.get(entry.getKey());
|
||
|
if (c13007fNt2 != null && c13007fNt2.b) {
|
||
|
for (C13005fNr c13005fNr : entry.getValue()) {
|
||
|
if (c13007fNt2.b) {
|
||
|
if (c13005fNr.a) {
|
||
|
dispatchProducerResultToHandler(c13005fNr, c13007fNt2);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void dispatchProducerResultToHandler(C13005fNr c13005fNr, C13007fNt c13007fNt) {
|
||
|
Object obj;
|
||
|
try {
|
||
|
obj = c13007fNt.b();
|
||
|
} catch (InvocationTargetException e) {
|
||
|
StringBuilder sb = new StringBuilder("Producer ");
|
||
|
sb.append(c13007fNt);
|
||
|
sb.append(" threw an exception.");
|
||
|
throwRuntimeException(sb.toString(), e);
|
||
|
obj = null;
|
||
|
}
|
||
|
if (obj == null) {
|
||
|
return;
|
||
|
}
|
||
|
dispatch(obj, c13005fNr);
|
||
|
}
|
||
|
|
||
|
public void unregister(Object obj) {
|
||
|
if (obj == null) {
|
||
|
throw new NullPointerException("Object to unregister must not be null.");
|
||
|
}
|
||
|
this.enforcer.b(this);
|
||
|
for (Map.Entry<Class<?>, C13007fNt> entry : this.handlerFinder.b(obj).entrySet()) {
|
||
|
Class<?> key = entry.getKey();
|
||
|
C13007fNt producerForEventType = getProducerForEventType(key);
|
||
|
C13007fNt value = entry.getValue();
|
||
|
if (value == null || !value.equals(producerForEventType)) {
|
||
|
StringBuilder sb = new StringBuilder("Missing event producer for an annotated method. Is ");
|
||
|
sb.append(obj.getClass());
|
||
|
sb.append(" registered?");
|
||
|
throw new IllegalArgumentException(sb.toString());
|
||
|
}
|
||
|
this.producersByType.remove(key).b = false;
|
||
|
}
|
||
|
for (Map.Entry<Class<?>, Set<C13005fNr>> entry2 : this.handlerFinder.c(obj).entrySet()) {
|
||
|
Set<C13005fNr> handlersForEventType = getHandlersForEventType(entry2.getKey());
|
||
|
Set<C13005fNr> value2 = entry2.getValue();
|
||
|
if (handlersForEventType == null || !handlersForEventType.containsAll(value2)) {
|
||
|
StringBuilder sb2 = new StringBuilder("Missing event handler for an annotated method. Is ");
|
||
|
sb2.append(obj.getClass());
|
||
|
sb2.append(" registered?");
|
||
|
throw new IllegalArgumentException(sb2.toString());
|
||
|
}
|
||
|
for (C13005fNr c13005fNr : handlersForEventType) {
|
||
|
if (value2.contains(c13005fNr)) {
|
||
|
c13005fNr.a = false;
|
||
|
}
|
||
|
}
|
||
|
handlersForEventType.removeAll(value2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void post(Object obj) {
|
||
|
if (obj == null) {
|
||
|
throw new NullPointerException("Event to post must not be null.");
|
||
|
}
|
||
|
this.enforcer.b(this);
|
||
|
Iterator<Class<?>> it = flattenHierarchy(obj.getClass()).iterator();
|
||
|
boolean z = false;
|
||
|
while (it.hasNext()) {
|
||
|
Set<C13005fNr> handlersForEventType = getHandlersForEventType(it.next());
|
||
|
if (handlersForEventType != null && !handlersForEventType.isEmpty()) {
|
||
|
Iterator<C13005fNr> it2 = handlersForEventType.iterator();
|
||
|
while (it2.hasNext()) {
|
||
|
enqueueEvent(obj, it2.next());
|
||
|
}
|
||
|
z = true;
|
||
|
}
|
||
|
}
|
||
|
if (!z && !(obj instanceof C12999fNl)) {
|
||
|
post(new C12999fNl(this, obj));
|
||
|
}
|
||
|
dispatchQueuedEvents();
|
||
|
}
|
||
|
|
||
|
protected void enqueueEvent(Object obj, C13005fNr c13005fNr) {
|
||
|
this.eventsToDispatch.get().offer(new IeS(obj, c13005fNr));
|
||
|
}
|
||
|
|
||
|
protected void dispatchQueuedEvents() {
|
||
|
if (this.isDispatching.get().booleanValue()) {
|
||
|
return;
|
||
|
}
|
||
|
this.isDispatching.set(Boolean.TRUE);
|
||
|
while (true) {
|
||
|
try {
|
||
|
IeS poll = this.eventsToDispatch.get().poll();
|
||
|
if (poll == null) {
|
||
|
return;
|
||
|
}
|
||
|
if (poll.c.a) {
|
||
|
dispatch(poll.e, poll.c);
|
||
|
}
|
||
|
} finally {
|
||
|
this.isDispatching.set(Boolean.FALSE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected void dispatch(Object obj, C13005fNr c13005fNr) {
|
||
|
try {
|
||
|
if (!c13005fNr.a) {
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
sb.append(c13005fNr.toString());
|
||
|
sb.append(" has been invalidated and can no longer handle events.");
|
||
|
throw new IllegalStateException(sb.toString());
|
||
|
}
|
||
|
try {
|
||
|
try {
|
||
|
c13005fNr.e.invoke(c13005fNr.c, obj);
|
||
|
} catch (InvocationTargetException e) {
|
||
|
if (e.getCause() instanceof Error) {
|
||
|
throw ((Error) e.getCause());
|
||
|
}
|
||
|
throw e;
|
||
|
}
|
||
|
} catch (IllegalAccessException e2) {
|
||
|
throw new AssertionError(e2);
|
||
|
}
|
||
|
} catch (InvocationTargetException e3) {
|
||
|
StringBuilder sb2 = new StringBuilder("Could not dispatch event: ");
|
||
|
sb2.append(obj.getClass());
|
||
|
sb2.append(" to handler ");
|
||
|
sb2.append(c13005fNr);
|
||
|
throwRuntimeException(sb2.toString(), e3);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
C13007fNt getProducerForEventType(Class<?> cls) {
|
||
|
return this.producersByType.get(cls);
|
||
|
}
|
||
|
|
||
|
Set<C13005fNr> getHandlersForEventType(Class<?> cls) {
|
||
|
return this.handlersByType.get(cls);
|
||
|
}
|
||
|
|
||
|
Set<Class<?>> flattenHierarchy(Class<?> cls) {
|
||
|
Set<Class<?>> set = this.flattenHierarchyCache.get(cls);
|
||
|
if (set != null) {
|
||
|
return set;
|
||
|
}
|
||
|
Set<Class<?>> classesFor = getClassesFor(cls);
|
||
|
Set<Class<?>> putIfAbsent = this.flattenHierarchyCache.putIfAbsent(cls, classesFor);
|
||
|
return putIfAbsent != null ? putIfAbsent : classesFor;
|
||
|
}
|
||
|
|
||
|
private Set<Class<?>> getClassesFor(Class<?> cls) {
|
||
|
LinkedList linkedList = new LinkedList();
|
||
|
HashSet hashSet = new HashSet();
|
||
|
linkedList.add(cls);
|
||
|
while (!linkedList.isEmpty()) {
|
||
|
Class cls2 = (Class) linkedList.remove(0);
|
||
|
hashSet.add(cls2);
|
||
|
Class superclass = cls2.getSuperclass();
|
||
|
if (superclass != null) {
|
||
|
linkedList.add(superclass);
|
||
|
}
|
||
|
}
|
||
|
return hashSet;
|
||
|
}
|
||
|
|
||
|
private static void throwRuntimeException(String str, InvocationTargetException invocationTargetException) {
|
||
|
Throwable cause = invocationTargetException.getCause();
|
||
|
if (cause != null) {
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
sb.append(str);
|
||
|
sb.append(": ");
|
||
|
sb.append(cause.getMessage());
|
||
|
throw new RuntimeException(sb.toString(), cause);
|
||
|
}
|
||
|
StringBuilder sb2 = new StringBuilder();
|
||
|
sb2.append(str);
|
||
|
sb2.append(": ");
|
||
|
sb2.append(invocationTargetException.getMessage());
|
||
|
throw new RuntimeException(sb2.toString(), invocationTargetException);
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: package-private */
|
||
|
/* renamed from: o.fNn$IeS */
|
||
|
/* loaded from: classes5.dex */
|
||
|
public static class IeS {
|
||
|
final C13005fNr c;
|
||
|
final Object e;
|
||
|
|
||
|
public IeS(Object obj, C13005fNr c13005fNr) {
|
||
|
this.e = obj;
|
||
|
this.c = c13005fNr;
|
||
|
}
|
||
|
}
|
||
|
}
|