001package com.avaje.ebeaninternal.server.cluster.message; 002 003import java.io.DataInputStream; 004import java.io.DataOutputStream; 005import java.io.IOException; 006 007/** 008 * The message broadcast around the cluster. 009 */ 010public class ClusterMessage { 011 012 private final String registerHost; 013 014 private final boolean register; 015 016 private final byte[] data; 017 018 /** 019 * Create a register message. 020 */ 021 public static ClusterMessage register(String registerHost, boolean register) { 022 return new ClusterMessage(registerHost, register); 023 } 024 025 /** 026 * Create a transaction message. 027 */ 028 public static ClusterMessage transEvent(byte[] data) { 029 return new ClusterMessage(data); 030 } 031 032 /** 033 * Create for register online/offline message. 034 */ 035 private ClusterMessage(String registerHost, boolean register) { 036 this.registerHost = registerHost; 037 this.register = register; 038 this.data = null; 039 } 040 041 /** 042 * Create for a transaction message. 043 */ 044 private ClusterMessage(byte[] data) { 045 this.data = data; 046 this.registerHost = null; 047 this.register = false; 048 } 049 050 public String toString() { 051 StringBuilder sb = new StringBuilder(); 052 if (registerHost != null) { 053 sb.append("register "); 054 sb.append(register); 055 sb.append(" "); 056 sb.append(registerHost); 057 } else { 058 sb.append("transEvent "); 059 } 060 return sb.toString(); 061 } 062 063 /** 064 * Return true if this is a register event as opposed to a transaction message. 065 */ 066 public boolean isRegisterEvent() { 067 return registerHost != null; 068 } 069 070 /** 071 * Return the register host for online/offline message. 072 */ 073 public String getRegisterHost() { 074 return registerHost; 075 } 076 077 /** 078 * Return true if register is true for a online/offline message. 079 */ 080 public boolean isRegister() { 081 return register; 082 } 083 084 /** 085 * Return the raw message data. 086 */ 087 public byte[] getData() { 088 return data; 089 } 090 091 /** 092 * Write the message in binary form. 093 */ 094 public void write(DataOutputStream dataOutput) throws IOException { 095 096 boolean dataMessage = data != null; 097 dataOutput.writeBoolean(dataMessage); 098 if (dataMessage) { 099 dataOutput.writeInt(data.length); 100 dataOutput.write(data); 101 } else { 102 // write register message 103 dataOutput.writeUTF(getRegisterHost()); 104 dataOutput.writeBoolean(isRegister()); 105 } 106 dataOutput.flush(); 107 } 108 109 /** 110 * Read the message from binary form. 111 */ 112 public static ClusterMessage read(DataInputStream dataInput) throws IOException { 113 114 boolean dataMessage = dataInput.readBoolean(); 115 if (dataMessage) { 116 int length = dataInput.readInt(); 117 byte[] data = new byte[length]; 118 dataInput.readFully(data); 119 return new ClusterMessage(data); 120 121 } else { 122 String host = dataInput.readUTF(); 123 boolean registered = dataInput.readBoolean(); 124 return new ClusterMessage(host, registered); 125 } 126 } 127 128}