Fixed up FirstArgSubscriber, code polish
This commit is contained in:
parent
1863df8db4
commit
be960b6913
@ -86,7 +86,8 @@ class MessageBus implements IMessageBus {
|
|||||||
*/
|
*/
|
||||||
public
|
public
|
||||||
MessageBus(int numberOfThreads) {
|
MessageBus(int numberOfThreads) {
|
||||||
this(PublishMode.ExactWithSuperTypes, SubscribeMode.MultiArg, numberOfThreads);
|
this(PublishMode.ExactWithSuperTypes, SubscribeMode.FirstArg, numberOfThreads);
|
||||||
|
// this(PublishMode.ExactWithSuperTypes, SubscribeMode.MultiArg, numberOfThreads);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -112,7 +113,7 @@ class MessageBus implements IMessageBus {
|
|||||||
subscriber = new MultiArgSubscriber(errorHandler, classUtils);
|
subscriber = new MultiArgSubscriber(errorHandler, classUtils);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
subscriber = new FirstArgSubscriber(errorHandler);
|
subscriber = new FirstArgSubscriber(errorHandler, classUtils);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (publishMode) {
|
switch (publishMode) {
|
||||||
@ -127,7 +128,6 @@ class MessageBus implements IMessageBus {
|
|||||||
|
|
||||||
case ExactWithSuperTypes:
|
case ExactWithSuperTypes:
|
||||||
if (isMultiArg) {
|
if (isMultiArg) {
|
||||||
|
|
||||||
subscriptionPublisher = new PublisherExactWithSuperTypes_MultiArg(errorHandler, subscriber, lock);
|
subscriptionPublisher = new PublisherExactWithSuperTypes_MultiArg(errorHandler, subscriber, lock);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -18,6 +18,8 @@ package dorkbox.util.messagebus.subscription;
|
|||||||
import dorkbox.util.messagebus.common.MessageHandler;
|
import dorkbox.util.messagebus.common.MessageHandler;
|
||||||
import dorkbox.util.messagebus.common.adapter.JavaVersionAdapter;
|
import dorkbox.util.messagebus.common.adapter.JavaVersionAdapter;
|
||||||
import dorkbox.util.messagebus.error.ErrorHandlingSupport;
|
import dorkbox.util.messagebus.error.ErrorHandlingSupport;
|
||||||
|
import dorkbox.util.messagebus.utils.ClassUtils;
|
||||||
|
import dorkbox.util.messagebus.utils.SubscriptionUtils;
|
||||||
import dorkbox.util.messagebus.utils.VarArgUtils;
|
import dorkbox.util.messagebus.utils.VarArgUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -36,6 +38,8 @@ public class FirstArgSubscriber implements Subscriber {
|
|||||||
|
|
||||||
private final ErrorHandlingSupport errorHandler;
|
private final ErrorHandlingSupport errorHandler;
|
||||||
|
|
||||||
|
private final SubscriptionUtils subUtils;
|
||||||
|
|
||||||
// all subscriptions per message type. We perpetually KEEP the types, as this lowers the amount of locking required
|
// all subscriptions per message type. We perpetually KEEP the types, as this lowers the amount of locking required
|
||||||
// this is the primary list for dispatching a specific message
|
// this is the primary list for dispatching a specific message
|
||||||
// write access is synchronized and happens only when a listener of a specific class is registered the first time
|
// write access is synchronized and happens only when a listener of a specific class is registered the first time
|
||||||
@ -44,11 +48,13 @@ public class FirstArgSubscriber implements Subscriber {
|
|||||||
private final Map<Class<?>, ArrayList<Subscription>> subscriptionsPerMessage;
|
private final Map<Class<?>, ArrayList<Subscription>> subscriptionsPerMessage;
|
||||||
|
|
||||||
|
|
||||||
public FirstArgSubscriber(final ErrorHandlingSupport errorHandler) {
|
public FirstArgSubscriber(final ErrorHandlingSupport errorHandler, final ClassUtils classUtils) {
|
||||||
this.errorHandler = errorHandler;
|
this.errorHandler = errorHandler;
|
||||||
|
|
||||||
// the following are used ONLY for FIRST ARG subscription/publication. (subscriptionsPerMessageMulti isn't used in this case)
|
// the following are used ONLY for FIRST ARG subscription/publication. (subscriptionsPerMessageMulti isn't used in this case)
|
||||||
this.subscriptionsPerMessage = JavaVersionAdapter.concurrentMap(32, LOAD_FACTOR, 1);
|
this.subscriptionsPerMessage = JavaVersionAdapter.concurrentMap(32, LOAD_FACTOR, 1);
|
||||||
|
|
||||||
|
this.subUtils = new SubscriptionUtils(classUtils, Subscriber.LOAD_FACTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// inside a write lock
|
// inside a write lock
|
||||||
@ -79,7 +85,7 @@ public class FirstArgSubscriber implements Subscriber {
|
|||||||
size = messageHandlerTypes.length;
|
size = messageHandlerTypes.length;
|
||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
errorHandler.handleError("Error while trying to subscribe class", listenerClass);
|
errorHandler.handleError("Error while trying to subscribe class: " + messageHandlerTypes.getClass(), listenerClass);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,50 +121,135 @@ public class FirstArgSubscriber implements Subscriber {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<Subscription> getExactAsArray(final Class<?> messageClass) {
|
public ArrayList<Subscription> getExactAsArray(final Class<?> messageClass) {
|
||||||
return subscriptionsPerMessage.get(messageClass);
|
return subscriptionsPerMessage.get(messageClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<Subscription> getExactAsArray(final Class<?> messageClass1, final Class<?> messageClass2) {
|
public ArrayList<Subscription> getExactAsArray(final Class<?> messageClass1, final Class<?> messageClass2) {
|
||||||
return subscriptionsPerMessage.get(messageClass1);
|
return subscriptionsPerMessage.get(messageClass1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<Subscription> getExactAsArray(final Class<?> messageClass1, final Class<?> messageClass2,
|
public ArrayList<Subscription> getExactAsArray(final Class<?> messageClass1, final Class<?> messageClass2,
|
||||||
final Class<?> messageClass3) {
|
final Class<?> messageClass3) {
|
||||||
return subscriptionsPerMessage.get(messageClass1);
|
return subscriptionsPerMessage.get(messageClass1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
public Subscription[] getExact(final Class<?> deadMessageClass) {
|
public
|
||||||
return new Subscription[0];
|
Subscription[] getExact(final Class<?> messageClass) {
|
||||||
|
final ArrayList<Subscription> collection = getExactAsArray(messageClass);
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
final Subscription[] subscriptions = new Subscription[collection.size()];
|
||||||
|
collection.toArray(subscriptions);
|
||||||
|
|
||||||
|
return subscriptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
public Subscription[] getExact(final Class<?> messageClass1, final Class<?> messageClass2) {
|
public Subscription[] getExact(final Class<?> messageClass1, final Class<?> messageClass2) {
|
||||||
return new Subscription[0];
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
public Subscription[] getExact(final Class<?> messageClass1, final Class<?> messageClass2, final Class<?> messageClass3) {
|
public Subscription[] getExact(final Class<?> messageClass1, final Class<?> messageClass2, final Class<?> messageClass3) {
|
||||||
return new Subscription[0];
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
public Subscription[] getExactAndSuper(final Class<?> messageClass) {
|
public Subscription[] getExactAndSuper(final Class<?> messageClass) {
|
||||||
return new Subscription[0];
|
ArrayList<Subscription> collection = getExactAsArray(messageClass); // can return null
|
||||||
|
|
||||||
|
// now publish superClasses
|
||||||
|
final ArrayList<Subscription> superSubscriptions = this.subUtils.getSuperSubscriptions(messageClass, this); // NOT return null
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
collection = new ArrayList<Subscription>(collection);
|
||||||
|
|
||||||
|
if (!superSubscriptions.isEmpty()) {
|
||||||
|
collection.addAll(superSubscriptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!superSubscriptions.isEmpty()) {
|
||||||
|
collection = superSubscriptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
final Subscription[] subscriptions = new Subscription[collection.size()];
|
||||||
|
collection.toArray(subscriptions);
|
||||||
|
return subscriptions;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Subscription[] getExactAndSuper(final Class<?> messageClass1, final Class<?> messageClass2) {
|
public Subscription[] getExactAndSuper(final Class<?> messageClass1, final Class<?> messageClass2) {
|
||||||
return new Subscription[0];
|
ArrayList<Subscription> collection = getExactAsArray(messageClass1); // can return null
|
||||||
|
|
||||||
|
// now publish superClasses
|
||||||
|
final ArrayList<Subscription> superSubscriptions = this.subUtils.getSuperSubscriptions(messageClass1, this); // NOT return null
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
collection = new ArrayList<Subscription>(collection);
|
||||||
|
|
||||||
|
if (!superSubscriptions.isEmpty()) {
|
||||||
|
collection.addAll(superSubscriptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!superSubscriptions.isEmpty()) {
|
||||||
|
collection = superSubscriptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
final Subscription[] subscriptions = new Subscription[collection.size()];
|
||||||
|
collection.toArray(subscriptions);
|
||||||
|
return subscriptions;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Subscription[] getExactAndSuper(final Class<?> messageClass1, final Class<?> messageClass2, final Class<?> messageClass3) {
|
public Subscription[] getExactAndSuper(final Class<?> messageClass1, final Class<?> messageClass2, final Class<?> messageClass3) {
|
||||||
return new Subscription[0];
|
ArrayList<Subscription> collection = getExactAsArray(messageClass1); // can return null
|
||||||
|
|
||||||
|
// now publish superClasses
|
||||||
|
final ArrayList<Subscription> superSubscriptions = this.subUtils.getSuperSubscriptions(messageClass1, this); // NOT return null
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
collection = new ArrayList<Subscription>(collection);
|
||||||
|
|
||||||
|
if (!superSubscriptions.isEmpty()) {
|
||||||
|
collection.addAll(superSubscriptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!superSubscriptions.isEmpty()) {
|
||||||
|
collection = superSubscriptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
final Subscription[] subscriptions = new Subscription[collection.size()];
|
||||||
|
collection.toArray(subscriptions);
|
||||||
|
return subscriptions;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,36 +196,6 @@ class MultiArgSubscriber implements Subscriber {
|
|||||||
return subscriptionsPerMessageMulti.get(messageClass1, messageClass2, messageClass3);
|
return subscriptionsPerMessageMulti.get(messageClass1, messageClass2, messageClass3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// can return null
|
|
||||||
@Override
|
|
||||||
public
|
|
||||||
Subscription[] getExactAndSuper(final Class<?> messageClass) {
|
|
||||||
ArrayList<Subscription> collection = getExactAsArray(messageClass); // can return null
|
|
||||||
|
|
||||||
// now publish superClasses
|
|
||||||
final ArrayList<Subscription> superSubscriptions = this.subUtils.getSuperSubscriptions(messageClass, this); // NOT return null
|
|
||||||
|
|
||||||
if (collection != null) {
|
|
||||||
collection = new ArrayList<Subscription>(collection);
|
|
||||||
|
|
||||||
if (!superSubscriptions.isEmpty()) {
|
|
||||||
collection.addAll(superSubscriptions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!superSubscriptions.isEmpty()) {
|
|
||||||
collection = superSubscriptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (collection != null) {
|
|
||||||
final Subscription[] subscriptions = new Subscription[collection.size()];
|
|
||||||
collection.toArray(subscriptions);
|
|
||||||
return subscriptions;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// can return null
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
public
|
public
|
||||||
@ -275,7 +245,35 @@ class MultiArgSubscriber implements Subscriber {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can return null
|
||||||
|
@Override
|
||||||
|
public
|
||||||
|
Subscription[] getExactAndSuper(final Class<?> messageClass) {
|
||||||
|
ArrayList<Subscription> collection = getExactAsArray(messageClass); // can return null
|
||||||
|
|
||||||
|
// now publish superClasses
|
||||||
|
final ArrayList<Subscription> superSubscriptions = this.subUtils.getSuperSubscriptions(messageClass, this); // NOT return null
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
collection = new ArrayList<Subscription>(collection);
|
||||||
|
|
||||||
|
if (!superSubscriptions.isEmpty()) {
|
||||||
|
collection.addAll(superSubscriptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!superSubscriptions.isEmpty()) {
|
||||||
|
collection = superSubscriptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (collection != null) {
|
||||||
|
final Subscription[] subscriptions = new Subscription[collection.size()];
|
||||||
|
collection.toArray(subscriptions);
|
||||||
|
return subscriptions;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// can return null
|
// can return null
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user