package org.buddycloud.channelserver.pubsub.model.impl;
import java.util.Date;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.buddycloud.channelserver.pubsub.model.NodeSubscription;
import org.buddycloud.channelserver.pubsub.subscription.Subscriptions;
import org.xmpp.packet.JID;
public class NodeSubscriptionImpl implements NodeSubscription {
private final Subscriptions subscription;
private final JID user;
private JID listener;
private final String nodeId;
private Date lastUpdated;
private JID invitedBy;
public NodeSubscriptionImpl(final String nodeId, final JID user, final Subscriptions subscription, JID invitedBy) {
this(nodeId, user, user, subscription, invitedBy, new Date());
}
public NodeSubscriptionImpl(final String nodeId, final JID user, final Subscriptions subscription, JID invitedBy, Date lastUpdated) {
this(nodeId, user, user, subscription, invitedBy, lastUpdated);
}
public NodeSubscriptionImpl(final String nodeId, final JID user, JID listener, final Subscriptions subscription, JID invitedBy) {
this(nodeId, user, listener, subscription, invitedBy, new Date());
}
public NodeSubscriptionImpl(final String nodeId, final JID user, JID listener, final Subscriptions subscription, JID invitedBy, Date lastUpdated) {
this.nodeId = nodeId;
if (user.getResource() == null) {
this.user = user;
} else {
this.user = new JID(user.toBareJID());
}
this.lastUpdated = new Date(lastUpdated.getTime());
setListener(listener);
this.subscription = subscription;
this.invitedBy = invitedBy;
}
private void setListener(JID listener) {
if (null == listener) {
this.listener = this.user;
return;
}
if (null == listener.getNode()) {
this.listener = new JID(listener.getDomain());
return;
}
this.listener = new JID(listener.toBareJID());
}
@Override
public Subscriptions getSubscription() {
return subscription;
}
@Override
public JID getUser() {
return user;
}
@Override
public JID getListener() {
return listener;
}
@Override
public String getNodeId() {
return nodeId;
}
@Override
public JID getInvitedBy() {
return invitedBy;
}
@Override
public final int hashCode() {
final int prime = 31;
return new HashCodeBuilder(17, prime).append(listener).append(nodeId).append(subscription).append(user).append(invitedBy).toHashCode();
}
@Override
public final boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
NodeSubscriptionImpl rhs = (NodeSubscriptionImpl) obj;
return new EqualsBuilder().append(listener, rhs.listener).append(nodeId, rhs.nodeId).append(subscription, rhs.subscription).append(user, rhs.user)
.append(invitedBy, rhs.invitedBy).isEquals();
}
@Override
public String toString() {
return "NodeSubscriptionImpl [subscription=" + subscription + ", user=" + user + ", listener=" + listener + ", nodeId=" + nodeId + "]";
}
@Override
public String getUID() {
return toString();
}
@Override
public Date getLastUpdated() {
// Return a defensive copy of the last updated time
return new Date(lastUpdated.getTime());
}
}