
io.jsync.eventbus.impl.BaseMessage Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jsync.io Show documentation
Show all versions of jsync.io Show documentation
jsync.io is a non-blocking, event-driven networking framework for Java
/*
* 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);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy