1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2025-09-09 18:29:45 +02:00

Add FlexiblePacketTypeFilter

and make constructors of MessageTypeFilter and IQTypeFilter
private, because we now provide constants instead.
This commit is contained in:
Florian Schmaus 2014-05-29 16:05:20 +02:00
parent c606530e22
commit 2a091debc1
18 changed files with 114 additions and 73 deletions

View file

@ -28,7 +28,10 @@ import java.util.concurrent.CopyOnWriteArraySet;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.filter.AndFilter;
import org.jivesoftware.smack.filter.FlexiblePacketTypeFilter;
import org.jivesoftware.smack.filter.FromMatchesFilter;
import org.jivesoftware.smack.filter.MessageTypeFilter;
import org.jivesoftware.smack.filter.OrFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.ThreadFilter;
import org.jivesoftware.smack.packet.Message;
@ -89,7 +92,16 @@ public class ChatManager extends Manager{
*/
BARE_JID;
}
private final PacketFilter packetFilter = new OrFilter(MessageTypeFilter.CHAT, new FlexiblePacketTypeFilter<Message>() {
@Override
protected boolean acceptSpecific(Message message) {
return normalIncluded ? message.getType() == Type.normal : false;
}
});
/**
* Determines whether incoming messages of type normal can create chats.
*/
@ -124,16 +136,6 @@ public class ChatManager extends Manager{
private ChatManager(XMPPConnection connection) {
super(connection);
PacketFilter filter = new PacketFilter() {
public boolean accept(Packet packet) {
if (!(packet instanceof Message)) {
return false;
}
Message.Type messageType = ((Message) packet).getType();
return (messageType == Type.chat) || (normalIncluded ? messageType == Type.normal : false);
}
};
// Add a listener for all message packets so that we can deliver
// messages to the best Chat instance available.
connection.addPacketListener(new PacketListener() {
@ -155,7 +157,7 @@ public class ChatManager extends Manager{
return;
deliverMessage(chat, message);
}
}, filter);
}, packetFilter);
INSTANCES.put(connection, this);
}

View file

@ -67,7 +67,7 @@ public class Roster {
private static final Logger LOGGER = Logger.getLogger(Roster.class.getName());
private static final PacketFilter ROSTER_PUSH_FILTER = new AndFilter(new PacketTypeFilter(
RosterPacket.class), new IQTypeFilter(IQ.Type.SET));
RosterPacket.class), IQTypeFilter.SET);
private static final PacketFilter PRESENCE_PACKET_FILTER = new PacketTypeFilter(Presence.class);

View file

@ -0,0 +1,52 @@
/**
*
* Copyright 2014 Florian Schmaus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smack.filter;
import java.lang.reflect.ParameterizedType;
import org.jivesoftware.smack.packet.Packet;
/**
* Filters for packets of a particular type and allows a custom method to further filter the packets.
*
* @author Florian Schmaus
*/
public abstract class FlexiblePacketTypeFilter<P extends Packet> implements PacketFilter {
final Class<P> packetType;
public FlexiblePacketTypeFilter(Class<P> packetType) {
this.packetType = packetType;
}
@SuppressWarnings("unchecked")
public FlexiblePacketTypeFilter() {
packetType = (Class<P>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@Override
@SuppressWarnings("unchecked")
public boolean accept(Packet packet) {
if (packetType.isInstance(packet)) {
return acceptSpecific((P) packet);
}
return false;
}
protected abstract boolean acceptSpecific(P packet);
}

View file

@ -92,7 +92,7 @@ public class IQReplyFilter implements PacketFilter {
server = conn.getServiceName().toLowerCase(Locale.US);
packetId = iqPacket.getPacketID();
PacketFilter iqFilter = new OrFilter(new IQTypeFilter(IQ.Type.ERROR), new IQTypeFilter(IQ.Type.RESULT));
PacketFilter iqFilter = new OrFilter(IQTypeFilter.ERROR, IQTypeFilter.RESULT);
PacketFilter idFilter = new PacketIDFilter(iqPacket);
iqAndIdFilter = new AndFilter(iqFilter, idFilter);
fromFilter = new OrFilter();

View file

@ -17,7 +17,7 @@
package org.jivesoftware.smack.filter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.IQ.Type;
/**
* A filter for IQ packet types. Returns true only if the packet is an IQ packet
@ -26,20 +26,22 @@ import org.jivesoftware.smack.packet.Packet;
* @author Alexander Wenckus
*
*/
public class IQTypeFilter implements PacketFilter {
public class IQTypeFilter extends FlexiblePacketTypeFilter<IQ> {
public static final PacketFilter GET = new IQTypeFilter(Type.GET);
public static final PacketFilter SET = new IQTypeFilter(Type.SET);
public static final PacketFilter RESULT = new IQTypeFilter(Type.RESULT);
public static final PacketFilter ERROR = new IQTypeFilter(Type.ERROR);
private IQ.Type type;
private final IQ.Type type;
public IQTypeFilter(IQ.Type type) {
private IQTypeFilter(IQ.Type type) {
super(IQ.class);
this.type = type;
}
/*
* (non-Javadoc)
*
* @see org.jivesoftware.smack.filter.PacketFilter#accept(org.jivesoftware.smack.packet.Packet)
*/
public boolean accept(Packet packet) {
return (packet instanceof IQ && ((IQ) packet).getType().equals(type));
}
@Override
protected boolean acceptSpecific(IQ iq) {
return iq.getType().equals(type);
}
}

View file

@ -18,7 +18,8 @@
package org.jivesoftware.smack.filter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Message.Type;
/**
* Filters for packets of a specific type of Message (e.g. CHAT).
@ -26,7 +27,13 @@ import org.jivesoftware.smack.packet.Packet;
* @see org.jivesoftware.smack.packet.Message.Type
* @author Ward Harold
*/
public class MessageTypeFilter implements PacketFilter {
public class MessageTypeFilter extends FlexiblePacketTypeFilter<Message> {
public static final PacketFilter NORMAL = new MessageTypeFilter(Type.normal);
public static final PacketFilter CHAT = new MessageTypeFilter(Type.chat);
public static final PacketFilter GROUPCHAT = new MessageTypeFilter(Type.groupchat);
public static final PacketFilter HEADLINE = new MessageTypeFilter(Type.headline);
public static final PacketFilter ERROR = new MessageTypeFilter(Type.headline);
private final Message.Type type;
@ -35,17 +42,14 @@ public class MessageTypeFilter implements PacketFilter {
*
* @param type the message type.
*/
public MessageTypeFilter(Message.Type type) {
private MessageTypeFilter(Message.Type type) {
super(Message.class);
this.type = type;
}
public boolean accept(Packet packet) {
if (!(packet instanceof Message)) {
return false;
}
else {
return ((Message) packet).getType().equals(this.type);
}
@Override
protected boolean acceptSpecific(Message message) {
return message.getType().equals(this.type);
}
}

View file

@ -46,10 +46,6 @@ public class PacketTypeFilter implements PacketFilter {
* @param packetType the Class type.
*/
public PacketTypeFilter(Class<? extends Packet> packetType) {
// Ensure the packet type is a sub-class of Packet.
if (!Packet.class.isAssignableFrom(packetType)) {
throw new IllegalArgumentException("Packet type must be a sub-class of Packet.");
}
this.packetType = packetType;
}