]
Brian Leathem updated RF-12303:
-------------------------------
Summary: Custom topiclistener not working on richfaces push component of verion
4.2.2-Final and older (was: Customer topiclistener not working on richfaces push
component of verion 4.2.2-Final and older)
Custom topiclistener not working on richfaces push component of
verion 4.2.2-Final and older
--------------------------------------------------------------------------------------------
Key: RF-12303
URL:
https://issues.jboss.org/browse/RF-12303
Project: RichFaces
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: component-a4j-core, component-push/poll
Affects Versions: 4.2.2.Final
Environment: No deponds on what environment.
Reporter: Daniel Yang
Labels: push, richfaces
Fix For: 4.3.0.M3
Original Estimate: 5 minutes
Remaining Estimate: 5 minutes
See description here:
https://community.jboss.org/message/736651#736651
Copy it again:
I use it like following lines:
{code:java}
TopicsContext topicsContext = TopicsContext.lookup();
Topic topic = topicsContext.getOrCreateTopic(new TopicKey("test"));
topic.setMessageDataSerializer(DefaultMessageDataSerializer.instance());
topic.addTopicListener(new SessionTopicListener2() {
@Override
public void processPreSubscriptionEvent(SessionPreSubscriptionEvent event)
throws SubscriptionFailureException {
//TODO
}
@Override
public void processSubscriptionEvent(SessionSubscriptionEvent event) {
//TODO
}
@Override
public void processUnsubscriptionEvent(SessionUnsubscriptionEvent event) {
//TODO
}
});
{code}
I noted that listeners in TopicImpl are all the SessionTopicListener2 type, because add
method is:
{code:java}
public void addTopicListener(TopicListener topicListener) {
TopicListener listener = topicListener;
if (listener instanceof SessionTopicListener) {
listener = new SessionTopicListenerWrapper((SessionTopicListener) listener);
}
listeners.add(listener);
}
{code}
All SessionTopicListeners are wrapped to type SessionTopicListener2, and when event
publish in TopicImpl, it check it if it is appropriate listener like this:
{code:java}
public void publishEvent(TopicEvent event) {
for (TopicListener listener : listeners) {
if (event.isAppropriateListener(listener)) {
try {
event.invokeListener(listener);
} catch (Exception e) {
logError(e);
}
}
}
}
{code}
But event type SessionPreSubscriptionEvent, SessionSubscriptionEvent or
SessionUnsubscriptionEvent does not override the mothed isAppropriateListener, so when
checking, it use the method of its parent SessionTopicEvent, its parent method is like
this:
{code:java}
@Override
public boolean isAppropriateListener(EventListener listener) {
return (listener instanceof SessionTopicListener);
}
{code}
Then it always returns false for above three SessionTopicEvent , and the custom listeners
will never be called. I think it may be changed from " return (listener instanceof
SessionTopicListener);" to return (listener instanceof SessionTopicListener2); or
override it in seperator implementation of type SessionTopicEvent.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: