/*
* Copyright (C) 2013-2014 Sony Computer Science Laboratories, Inc. All Rights Reserved.
* Copyright (C) 2014 Sony Corporation. All Rights Reserved.
*/
package com.sonycsl.wamp;
import com.sonycsl.wamp.message.WampMessage;
import com.sonycsl.wamp.message.WampMessageFactory;
import com.sonycsl.wamp.role.WampRole;
import org.json.JSONObject;
import java.util.HashSet;
import java.util.Set;
abstract public class WampClient extends WampPeer {
@Override
protected final Set<WampRole> getRoleSet() {
Set<WampRole> roleSet = new HashSet<WampRole>();
Set<WampRole> clientRole = getClientRoleSet();
roleSet.add(new WampClientSession());
roleSet.addAll(clientRole);
return roleSet;
}
abstract protected Set<WampRole> getClientRoleSet();
@Override
public final void transmit(WampMessage msg) {
super.transmit(msg);
}
private static final class WampClientSession extends WampRole {
public WampClientSession() {
}
@Override
public final String getRoleName() {
return "sessionClient";
}
@Override
protected final boolean resolveTxMessageImpl(WampPeer receiver, WampMessage msg) {
if (msg.isHelloMessage()) {
return true;
}
if (msg.isGoodbyeMessage()) {
return true;
}
return false;
}
@Override
protected final boolean resolveRxMessageImpl(WampPeer transmitter, WampMessage msg,
OnReplyListener listener) {
if (msg.isWelcomeMessage()) {
return true;
}
if (msg.isAbortMessage() || msg.isErrorMessage()) {
return true;
}
if (msg.isGoodbyeMessage()) {
return resolveGoodbyeMessage(transmitter, msg, listener);
}
if (msg.isChallengeMessage()) {
return resolveInvalidMessage(transmitter, msg, listener);
}
if (msg.isHeartbeatMessage()) {
return resolveInvalidMessage(transmitter, msg, listener);
}
return false;
}
private boolean resolveGoodbyeMessage(WampPeer transmitter, WampMessage msg,
OnReplyListener listener) {
String reason = msg.asGoodbyeMessage().getReason();
if (reason.equals(WampError.GOODBYE_AND_OUT)) {
return true;
}
if (reason.equals(WampError.SYSTEM_SHUTDOWN)
|| reason.equals(WampError.CLOSE_REALM)) {
listener.onReply(transmitter, WampMessageFactory.createGoodbye(new JSONObject(),
WampError.GOODBYE_AND_OUT));
return true;
}
return resolveInvalidMessage(transmitter, msg, listener);
}
private boolean resolveInvalidMessage(WampPeer transmitter, WampMessage msg,
OnReplyListener listener) {
listener.onReply(transmitter,
WampMessageFactory.createError(msg.getMessageType(), -1, new JSONObject(),
WampError.NOT_AUTHORIZED));
return true;
}
}
}