@Override public boolean onMessage(ServerSession from, ServerChannel channel, Mutable message) { try { Object data = message.getData(); final Object orig = data; for (DataFilter filter : _filters) { data = filter.filter(from, channel, data); if (data == null) { return false; } } if (data != orig) { message.setData(data); } return true; } catch (DataFilter.AbortException a) { if (_logger.isDebugEnabled()) { _logger.debug("", a); } return false; } } }
@Override public boolean send(ServerSession from, ServerSession to, ServerMessage.Mutable message) { Object data = message.getData(); if (data instanceof BinaryData) { BinaryData binaryData = (BinaryData)data; Object binary = binaryData.get(BinaryData.DATA); String encoded; if (binary instanceof byte[]) { encoded = Z85.encoder.encodeBytes(binaryData.asBytes()); } else if (binary instanceof ByteBuffer) { encoded = Z85.encoder.encodeByteBuffer(binaryData.asByteBuffer()); } else { throw new IllegalArgumentException("Cannot Z85 encode " + binary); } Map<String, Object> newData = new HashMap<>(binaryData); newData.put(BinaryData.DATA, encoded); message.setData(newData); Map<String, Object> ext = message.getExt(true); ext.put(BinaryData.EXT_NAME, new HashMap<>(0)); } return true; } }
@Override public void run() { for (SystemTopics topic : SystemTopics.values()) { String topicData; switch (topic) { case Time: topicData = logDateFormat.format(new Date()); break; default: topicData = "unknown topic: " + topic.toString(); } ServerMessage.Mutable message = bayeuxServer.newMessage(); message.setChannel(channels.get(topic.ordinal()).getId()); message.setData(topicData); channels.get(topic.ordinal()).publish(session, message); } } }
@Override public ServerMessage send(ServerSession session, ServerMessage message) { Object data = message.getData(); if (data instanceof BinaryData) { ServerMessage.Mutable result = bayeuxServer.newMessage(); result.putAll(message); BinaryData binaryData = (BinaryData)data; Object binary = binaryData.get(BinaryData.DATA); String encoded; if (binary instanceof byte[]) { encoded = Z85.encoder.encodeBytes(binaryData.asBytes()); } else if (binary instanceof ByteBuffer) { encoded = Z85.encoder.encodeByteBuffer(binaryData.asByteBuffer()); } else { throw new IllegalArgumentException("Cannot Z85 encode " + binary); } Map<String, Object> newData = new HashMap<>(binaryData); newData.put(BinaryData.DATA, encoded); result.setData(newData); Map<String, Object> ext = result.getExt(true); ext.put(BinaryData.EXT_NAME, new HashMap<>(0)); return result; } else { return message; } } }
@Override public boolean rcv(ServerSession from, ServerMessage.Mutable message) { Map<String, Object> ext = message.getExt(); if (ext != null) { if (ext.remove(BinaryData.EXT_NAME) != null) { Map<String, Object> data = message.getDataAsMap(); BinaryData newData = new BinaryData(data); message.setData(newData); String encoded = (String)data.get(BinaryData.DATA); Object decoded = decodeToByteBuffer ? Z85.decoder.decodeByteBuffer(encoded) : Z85.decoder.decodeBytes(encoded); newData.put(BinaryData.DATA, decoded); } } return true; }
@Override public boolean rcv(ServerSession session, ServerMessage.Mutable message) { Map<String, Object> ext = message.getExt(); if (ext != null) { if (ext.remove(BinaryData.EXT_NAME) != null) { Map<String, Object> data = message.getDataAsMap(); BinaryData newData = new BinaryData(data); message.setData(newData); String encoded = (String)data.get(BinaryData.DATA); Object decoded = decodeToByteBuffer ? Z85.decoder.decodeByteBuffer(encoded) : Z85.decoder.decodeBytes(encoded); newData.put(BinaryData.DATA, decoded); } } return true; }
private boolean deliver(Object data, boolean successful) { boolean completed = complete.compareAndSet(false, true); if (completed) { ServerMessage.Mutable message = bayeux.newMessage(); message.setId(messageId); message.setSuccessful(successful); message.setChannel(channel); message.setData(data); session.deliver(sender, message, Promise.noop()); } return completed; } }
@Override public void publish(Session from, Object data, Promise<Boolean> promise) { ServerMessage.Mutable mutable = _bayeux.newMessage(); mutable.setData(data); publish(from, mutable, promise); }
@Override public void deliver(Session sender, String channelId, Object data, Promise<Boolean> promise) { ServerMessage.Mutable message = _bayeux.newMessage(); message.setChannel(channelId); message.setData(data); deliver(sender, message, promise); }