/*
* (C) Copyright 2015-2016 the original author or authors.
*
* 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.
*
* Contributors:
* ohun@live.cn (夜色)
*/
package com.mpush.common.message.gateway;
import com.alibaba.fastjson.TypeReference;
import com.mpush.api.common.Condition;
import com.mpush.api.connection.Connection;
import com.mpush.api.protocol.Packet;
import com.mpush.api.spi.push.IPushMessage;
import com.mpush.common.condition.*;
import com.mpush.common.memory.PacketFactory;
import com.mpush.common.message.ByteBufMessage;
import com.mpush.tools.Jsons;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFutureListener;
import java.util.Set;
import static com.mpush.api.protocol.Command.GATEWAY_PUSH;
/**
* Created by ohun on 2015/12/30.
*
* @author ohun@live.cn
*/
public final class GatewayPushMessage extends ByteBufMessage implements IPushMessage {
public String userId;
public int clientType;
public int timeout;
public byte[] content;
public String taskId;
public Set<String> tags;
public String condition;
public GatewayPushMessage(Packet message, Connection connection) {
super(message, connection);
}
public static GatewayPushMessage build(Connection connection) {
Packet packet = PacketFactory.get(GATEWAY_PUSH);
packet.sessionId = genSessionId();
return new GatewayPushMessage(packet, connection);
}
@Override
public void decode(ByteBuf body) {
userId = decodeString(body);
clientType = decodeInt(body);
timeout = decodeInt(body);
content = decodeBytes(body);
taskId = decodeString(body);
tags = decodeSet(body);
condition = decodeString(body);
}
@Override
public void encode(ByteBuf body) {
encodeString(body, userId);
encodeInt(body, clientType);
encodeInt(body, timeout);
encodeBytes(body, content);
encodeString(body, taskId);
encodeSet(body, tags);
encodeString(body, condition);
}
private Set<String> decodeSet(ByteBuf body) {
String json = decodeString(body);
if (json == null) return null;
return Jsons.fromJson(json, new TypeReference<Set<String>>() {
}.getType());
}
private void encodeSet(ByteBuf body, Set<String> field) {
String json = field == null ? null : Jsons.toJson(field);
encodeString(body, json);
}
public GatewayPushMessage setUserId(String userId) {
this.userId = userId;
return this;
}
public GatewayPushMessage setContent(byte[] content) {
this.content = content;
return this;
}
public GatewayPushMessage setClientType(int clientType) {
this.clientType = clientType;
return this;
}
public GatewayPushMessage addFlag(byte flag) {
packet.addFlag(flag);
return this;
}
public GatewayPushMessage setTimeout(int timeout) {
this.timeout = timeout;
return this;
}
public GatewayPushMessage setTags(Set<String> tags) {
this.tags = tags;
return this;
}
public GatewayPushMessage setCondition(String condition) {
this.condition = condition;
return this;
}
@Override
public boolean isBroadcast() {
return userId == null;
}
@Override
public String getUserId() {
return userId;
}
@Override
public int getClientType() {
return clientType;
}
@Override
public int getTimeoutMills() {
return timeout;
}
@Override
public String getTaskId() {
return taskId;
}
@Override
public byte[] getContent() {
return content;
}
@Override
public boolean isNeedAck() {
return packet.hasFlag(Packet.FLAG_BIZ_ACK) || packet.hasFlag(Packet.FLAG_AUTO_ACK);
}
@Override
public byte getFlags() {
return packet.flags;
}
@Override
public Condition getCondition() {
if (condition != null) {
return new ScriptCondition(condition);
}
if (tags != null) {
return new TagsCondition(tags);
}
return AwaysPassCondition.I;
}
@Override
public void finalized() {
this.content = null;
this.condition = null;
this.tags = null;
}
@Override
public void send() {
super.sendRaw();
}
@Override
public void send(ChannelFutureListener listener) {
super.sendRaw(listener);
}
@Override
public String toString() {
return "GatewayPushMessage{" +
"userId='" + userId + '\'' +
", clientType='" + clientType + '\'' +
", timeout='" + timeout + '\'' +
", content='" + (content == null ? 0 : content.length) + '\'' +
'}';
}
}