/**
*
*/
package vnet.sms.common.wme.send;
import static org.apache.commons.lang.Validate.notNull;
import java.io.Serializable;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.DownstreamMessageEvent;
import vnet.sms.common.messages.GsmPdu;
import vnet.sms.common.wme.MessageEventType;
import vnet.sms.common.wme.WindowedMessageEvent;
/**
* @author obergner
*
*/
public abstract class DownstreamWindowedMessageEvent<ID extends Serializable, M extends GsmPdu>
extends DownstreamMessageEvent implements WindowedMessageEvent<ID, M> {
private final ID messageReference;
private final MessageEventType type;
protected DownstreamWindowedMessageEvent(final ID messageReference,
final MessageEventType type,
final DownstreamMessageEvent downstreamMessageEvent, final M message) {
this(messageReference, type, downstreamMessageEvent.getChannel(),
downstreamMessageEvent.getFuture(), message);
}
protected DownstreamWindowedMessageEvent(final ID messageReference,
final MessageEventType type, final Channel channel,
final ChannelFuture future, final Object message) {
super(channel, future, message, channel.getRemoteAddress());
notNull(messageReference,
"Argument 'messageReference' must not be null");
notNull(channel, "Argument 'channel' must not be null");
notNull(future, "Argument 'future' must not be null");
notNull(message, "Argument 'message' must not be null");
this.messageReference = messageReference;
this.type = type;
}
/**
* @see vnet.sms.common.wme.WindowedMessageEvent#getMessageReference()
*/
@Override
public ID getMessageReference() {
return this.messageReference;
}
/**
* @see vnet.sms.common.wme.WindowedMessageEvent#getMessageType()
*/
@Override
public MessageEventType getMessageType() {
return this.type;
}
/**
* @see vnet.sms.common.wme.WindowedMessageEvent#getMessage()
*/
@Override
public M getMessage() {
return (M) super.getMessage();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime
* result
+ ((this.messageReference == null) ? 0 : this.messageReference
.hashCode());
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final DownstreamWindowedMessageEvent<? extends Serializable, ? extends GsmPdu> other = (DownstreamWindowedMessageEvent<? extends Serializable, ? extends GsmPdu>) obj;
if (this.messageReference == null) {
if (other.messageReference != null) {
return false;
}
} else if (!this.messageReference.equals(other.messageReference)) {
return false;
}
return true;
}
@Override
public String toString() {
return getClass().getSimpleName() + "@" + hashCode()
+ "[messageReference: " + this.messageReference + "|message: "
+ getMessage() + "|channel: " + getChannel()
+ "|remoteAddress: " + getRemoteAddress() + "]";
}
}