All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.jsync.eventbus.impl.BaseMessage Maven / Gradle / Ivy

There is a newer version: 1.10.13
Show newest version
/*
 * Copyright (c) 2011-2013 The original author or authors
 * ------------------------------------------------------
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution.
 *
 *     The Eclipse Public License is available at
 *     http://www.eclipse.org/legal/epl-v10.html
 *
 *     The Apache License v2.0 is available at
 *     http://www.opensource.org/licenses/apache2.0.php
 *
 * You may elect to redistribute this code under either of these licenses.
 */

package io.jsync.eventbus.impl;

import io.jsync.AsyncResult;
import io.jsync.Handler;
import io.jsync.buffer.Buffer;
import io.jsync.eventbus.Message;
import io.jsync.eventbus.ReplyException;
import io.jsync.eventbus.ReplyFailure;
import io.jsync.json.JsonArray;
import io.jsync.json.JsonObject;
import io.jsync.net.NetSocket;
import io.jsync.net.impl.ServerID;
import io.netty.util.CharsetUtil;

/**
 * @author Tim Fox
 */
public abstract class BaseMessage implements Message {

    protected U body;
    protected ServerID sender;
    protected DefaultEventBus bus;
    protected String address;
    protected String replyAddress;
    protected boolean send; // Is it a send or a publish?

    protected BaseMessage(boolean send, String address, U body) {
        this.send = send;
        this.body = body;
        this.address = address;
    }

    protected BaseMessage(Buffer readBuff) {
        int pos = 1;
        byte bsend = readBuff.getByte(pos);
        send = bsend == 0;
        pos += 1;
        int addressLength = readBuff.getInt(pos);
        pos += 4;
        byte[] addressBytes = readBuff.getBytes(pos, pos + addressLength);
        pos += addressLength;
        address = new String(addressBytes, CharsetUtil.UTF_8);
        int port = readBuff.getInt(pos);
        pos += 4;
        int hostLength = readBuff.getInt(pos);
        pos += 4;
        byte[] hostBytes = readBuff.getBytes(pos, pos + hostLength);
        pos += hostLength;
        String host = new String(hostBytes, CharsetUtil.UTF_8);
        sender = new ServerID(port, host);
        int replyAddressLength = readBuff.getInt(pos);
        pos += 4;
        if (replyAddressLength > 0) {
            byte[] replyAddressBytes = readBuff.getBytes(pos, pos + replyAddressLength);
            pos += replyAddressLength;
            replyAddress = new String(replyAddressBytes, CharsetUtil.UTF_8);
        } else {
            replyAddress = null;
        }
        readBody(pos, readBuff);
    }

    @Override
    public String address() {
        return address;
    }

    @Override
    public U body() {
        return body;
    }

    @Override
    public String replyAddress() {
        return replyAddress;
    }

    @Override
    public void reply() {
        sendReply(DefaultEventBus.createMessage(true, replyAddress, null), null);
    }

    @Override
    public void reply(Object message) {
        reply(message, null);
    }

    @Override
    public void reply(JsonObject message) {
        reply(message, null);
    }

    @Override
    public void reply(JsonArray message) {
        reply(message, null);
    }

    @Override
    public void reply(String message) {
        reply(message, null);
    }

    @Override
    public void reply(Buffer message) {
        reply(message, null);
    }

    @Override
    public void reply(byte[] message) {
        reply(message, null);
    }

    @Override
    public void reply(Integer message) {
        reply(message, null);
    }

    @Override
    public void reply(Long message) {
        reply(message, null);
    }

    @Override
    public void reply(Short message) {
        reply(message, null);
    }

    @Override
    public void reply(Character message) {
        reply(message, null);
    }

    @Override
    public void reply(Boolean message) {
        reply(message, null);
    }

    @Override
    public void reply(Float message) {
        reply(message, null);
    }

    @Override
    public void reply(Double message) {
        reply(message, null);
    }

    @Override
    public  void reply(Handler> replyHandler) {
        sendReply(DefaultEventBus.createMessage(true, replyAddress, null), replyHandler);
    }

    @Override
    public  void replyWithTimeout(long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(DefaultEventBus.createMessage(true, replyAddress, null), timeout, replyHandler);
    }

    @Override
    public  void reply(Object message, Handler> replyHandler) {
        sendReply(DefaultEventBus.createMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Object message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(DefaultEventBus.createMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(JsonObject message, Handler> replyHandler) {
        sendReply(new JsonObjectMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(JsonObject message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new JsonObjectMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(JsonArray message, Handler> replyHandler) {
        sendReply(new JsonArrayMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(JsonArray message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new JsonArrayMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(String message, Handler> replyHandler) {
        sendReply(new StringMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(String message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new StringMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(Buffer message, Handler> replyHandler) {
        sendReply(new BufferMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Buffer message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new BufferMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(byte[] message, Handler> replyHandler) {
        sendReply(new ByteArrayMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(byte[] message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new ByteArrayMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(Integer message, Handler> replyHandler) {
        sendReply(new IntMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Integer message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new IntMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(Long message, Handler> replyHandler) {
        sendReply(new LongMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Long message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new LongMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(Short message, Handler> replyHandler) {
        sendReply(new ShortMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Short message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new ShortMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(Character message, Handler> replyHandler) {
        sendReply(new CharacterMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Character message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new CharacterMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(Boolean message, Handler> replyHandler) {
        sendReply(new BooleanMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Boolean message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new BooleanMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(Float message, Handler> replyHandler) {
        sendReply(new FloatMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Float message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new FloatMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public  void reply(Double message, Handler> replyHandler) {
        sendReply(new DoubleMessage(true, replyAddress, message), replyHandler);
    }

    @Override
    public  void replyWithTimeout(Double message, long timeout, Handler>> replyHandler) {
        sendReplyWithTimeout(new DoubleMessage(true, replyAddress, message), timeout, replyHandler);
    }

    @Override
    public void fail(int failureCode, String message) {
        sendReply(new ReplyFailureMessage(replyAddress, new ReplyException(ReplyFailure.RECIPIENT_FAILURE, failureCode, message)), null);
    }

    protected void write(NetSocket socket) {
        int length = 1 + 1 + 4 + address.length() + 1 + 4 * sender.host.length() +
                4 + (replyAddress == null ? 0 : replyAddress.length()) +
                getBodyLength();
        Buffer totBuff = new Buffer(length);
        totBuff.appendInt(0);
        totBuff.appendByte(type());
        totBuff.appendByte(send ? (byte) 0 : (byte) 1);
        writeString(totBuff, address);
        totBuff.appendInt(sender.port);
        writeString(totBuff, sender.host);
        if (replyAddress != null) {
            writeString(totBuff, replyAddress);
        } else {
            totBuff.appendInt(0);
        }
        writeBody(totBuff);
        totBuff.setInt(0, totBuff.length() - 4);
        socket.write(totBuff);
    }

    protected void writeString(Buffer buff, String str) {
        byte[] strBytes = str.getBytes(CharsetUtil.UTF_8);
        buff.appendInt(strBytes.length);
        buff.appendBytes(strBytes);
    }

    protected abstract byte type();

    protected abstract Message copy();

    protected abstract void readBody(int pos, Buffer readBuff);

    protected abstract void writeBody(Buffer buff);

    protected abstract int getBodyLength();

    private  void sendReply(BaseMessage msg, Handler> replyHandler) {
        if (bus != null && replyAddress != null) {
            bus.sendReply(sender, msg, replyHandler);
        }
    }

    private  void sendReplyWithTimeout(BaseMessage msg, long timeout, Handler>> replyHandler) {
        if (bus != null) {
            bus.sendReplyWithTimeout(sender, msg, timeout, replyHandler);
        }
    }
}