package io.ebeaninternal.server.transaction;

import io.ebeaninternal.api.BinaryReadContext;
import io.ebeaninternal.api.BinaryWritable;
import io.ebeaninternal.api.BinaryWriteContext;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.api.TransactionEventTable;
import io.ebeaninternal.api.TransactionEventTable.TableIUD;
import io.ebeaninternal.server.cache.RemoteCacheEvent;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class RemoteTransactionEvent implements Runnable, BinaryWritable {

  private final List<BeanPersistIds> beanPersistList = new ArrayList<>();

  private List<TableIUD> tableList;

  private DeleteByIdMap deleteByIdMap;

  private RemoteCacheEvent remoteCacheEvent;

  private RemoteTableMod remoteTableMod;

  private String serverName;

  private transient SpiEbeanServer server;

  
Create for sending to other servers in the cluster.
/** * Create for sending to other servers in the cluster. */
public RemoteTransactionEvent(String serverName) { this.serverName = serverName; }
Create from Reading and processing from remote server.
/** * Create from Reading and processing from remote server. */
public RemoteTransactionEvent(SpiEbeanServer server) { this.server = server; } @Override public void run() { server.remoteTransactionEvent(this); } @Override public String toString() { StringBuilder sb = new StringBuilder(100); sb.append("TransEvent["); if (remoteTableMod != null) { sb.append(remoteTableMod); } if (!beanPersistList.isEmpty()) { sb.append(beanPersistList); } if (tableList != null) { sb.append(tableList); } if (deleteByIdMap != null) { sb.append(deleteByIdMap); } sb.append("]"); return sb.toString(); }
Read the binary message.
/** * Read the binary message. */
public void readBinary(BinaryReadContext dataInput) throws IOException { boolean more = dataInput.readBoolean(); while (more) { int msgType = dataInput.readInt(); readBinaryMessage(msgType, dataInput); more = dataInput.readBoolean(); } } private void readBinaryMessage(int msgType, BinaryReadContext dataInput) throws IOException { switch (msgType) { case BinaryWritable.TYPE_BEANIUD: addBeanPersistIds(BeanPersistIds.readBinaryMessage(server, dataInput)); break; case BinaryWritable.TYPE_TABLEIUD: addTableIUD(TransactionEventTable.TableIUD.readBinaryMessage(dataInput)); break; case BinaryWritable.TYPE_CACHE: addRemoteCacheEvent(RemoteCacheEvent.readBinaryMessage(dataInput)); break; case BinaryWritable.TYPE_TABLEMOD: addRemoteTableMod(RemoteTableMod.readBinaryMessage(dataInput)); break; default: throw new RuntimeException("Invalid Transaction msgType " + msgType); } }
Write a binary message to byte array given an initial buffer size.
/** * Write a binary message to byte array given an initial buffer size. */
public byte[] writeBinaryAsBytes(int bufferSize) throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(bufferSize); DataOutputStream out = new DataOutputStream(buffer); BinaryWriteContext context = new BinaryWriteContext(out); writeBinary(context); out.close(); return buffer.toByteArray(); } @Override public void writeBinary(BinaryWriteContext out) throws IOException { DataOutputStream os = out.os(); os.writeUTF(serverName); if (remoteTableMod != null) { remoteTableMod.writeBinary(out); } if (tableList != null) { for (TableIUD aTableList : tableList) { aTableList.writeBinary(out); } } if (deleteByIdMap != null) { for (BeanPersistIds deleteIds : deleteByIdMap.values()) { deleteIds.writeBinary(out); } } for (BeanPersistIds aBeanPersistList : beanPersistList) { aBeanPersistList.writeBinary(out); } if (remoteCacheEvent != null) { remoteCacheEvent.writeBinary(out); } out.end(); os.flush(); } public boolean isEmpty() { return beanPersistList.isEmpty() && (tableList == null || tableList.isEmpty()) && (deleteByIdMap == null || deleteByIdMap.isEmpty()) && remoteTableMod == null && remoteCacheEvent == null; } public void addBeanPersistIds(BeanPersistIds beanPersist) { beanPersistList.add(beanPersist); }
Add a cache clearAll event.
/** * Add a cache clearAll event. */
public RemoteTransactionEvent cacheClearAll() { this.remoteCacheEvent = new RemoteCacheEvent(true); return this; }
Add a cache clear event for the given bean type.
/** * Add a cache clear event for the given bean type. */
public RemoteTransactionEvent cacheClear(Class<?> beanType) { this.remoteCacheEvent = new RemoteCacheEvent(beanType); return this; }
Set the RemoteCacheEvent.
/** * Set the RemoteCacheEvent. */
public void addRemoteCacheEvent(RemoteCacheEvent remoteCacheEvent) { this.remoteCacheEvent = remoteCacheEvent; } public void addTableIUD(TableIUD tableIud) { if (tableList == null) { tableList = new ArrayList<>(4); } tableList.add(tableIud); } public void addRemoteTableMod(RemoteTableMod remoteTableMod) { this.remoteTableMod = remoteTableMod; } public String getServerName() { return serverName; } public SpiEbeanServer getServer() { return server; } public void setServer(SpiEbeanServer server) { this.server = server; } void setDeleteByIdMap(DeleteByIdMap deleteByIdMap) { this.deleteByIdMap = deleteByIdMap; } public List<TableIUD> getTableIUDList() { return tableList; } public List<BeanPersistIds> getBeanPersistList() { return beanPersistList; } public RemoteCacheEvent getRemoteCacheEvent() { return remoteCacheEvent; } public RemoteTableMod getRemoteTableMod() { return remoteTableMod; } }