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}