package com.avaje.ebeaninternal.server.transaction; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.avaje.ebean.bean.EntityBean; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.server.cluster.BinaryMessage; import com.avaje.ebeaninternal.server.cluster.BinaryMessageList; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.server.deploy.BeanProperty; public class BeanDelta { private final List properties; private final BeanDescriptor beanDescriptor; private final Object id; public BeanDelta(BeanDescriptor beanDescriptor, Object id) { this.beanDescriptor = beanDescriptor; this.id = id; this.properties = new ArrayList(); } public BeanDescriptor getBeanDescriptor() { return beanDescriptor; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("BeanDelta["); sb.append(beanDescriptor.getName()).append(":"); sb.append(properties); sb.append("]"); return sb.toString(); } public Object getId() { return id; } public void add(BeanProperty beanProperty, Object value) { this.properties.add(new BeanDeltaProperty(beanProperty, value)); } public void add(BeanDeltaProperty propertyDelta) { this.properties.add(propertyDelta); } public void apply(EntityBean bean) { for (int i = 0; i < properties.size(); i++) { properties.get(i).apply(bean); } } /** * Read and return a BeanDelta from the binary input. */ public static BeanDelta readBinaryMessage(SpiEbeanServer server, DataInput dataInput) throws IOException { String descriptorId = dataInput.readUTF(); BeanDescriptor desc = server.getBeanDescriptorById(descriptorId); Object id = desc.getIdBinder().readData(dataInput); BeanDelta bp = new BeanDelta(desc, id); int count = dataInput.readInt(); for (int i = 0; i < count; i++) { String propName = dataInput.readUTF(); BeanProperty beanProperty = desc.getBeanProperty(propName); Object value = beanProperty.getScalarType().readData(dataInput); bp.add(beanProperty, value); } return bp; } /** * Write this bean delta in binary message format. */ public void writeBinaryMessage(BinaryMessageList msgList) throws IOException { BinaryMessage m = new BinaryMessage(50); DataOutputStream os = m.getOs(); os.writeInt(BinaryMessage.TYPE_BEANDELTA); os.writeUTF(beanDescriptor.getDescriptorId()); beanDescriptor.getIdBinder().writeData(os, id); os.writeInt(properties.size()); for (int i = 0; i < properties.size(); i++) { properties.get(i).writeBinaryMessage(m); } os.flush(); msgList.add(m); } }