package com.grendelscan.commons.flex.messages; import java.io.IOException; import com.grendelscan.commons.flex.AbstractAmfDataContainer; import com.grendelscan.commons.flex.AmfOutputStream; import com.grendelscan.commons.flex.AmfPrimitiveData; import com.grendelscan.commons.flex.arrays.AmfByteArray; import com.grendelscan.commons.flex.dataTypeDefinitions.AmfDataType; import flex.messaging.messages.AbstractMessage; import flex.messaging.messages.AsyncMessage; import flex.messaging.util.UUIDUtils; public class AmfAsyncMessage extends AmfAbstractMessage { /** * */ private static final long serialVersionUID = 1L; // Serialization constants private static byte CORRELATION_ID_FLAG = 1; private static byte CORRELATION_ID_BYTES_FLAG = 2; private static final String correlationIdName = "correlationId"; protected AmfAsyncMessage(final String name, final AbstractMessage message, final AmfDataType type, final String className, final AbstractAmfDataContainer<?> parent, final int transactionId) { super(name, message, type, className, parent, transactionId); initCorrelationId(""); } protected AmfAsyncMessage(final String name, final AmfDataType type, final boolean externalizable, final AbstractAmfDataContainer<?> parent, final int transactionId) { super(name, type, externalizable, parent, transactionId); initCorrelationId(""); } public AmfAsyncMessage(final String name, final AsyncMessage message, final String className, final AbstractAmfDataContainer<?> parent, final int transactionId) { super(name, message, AmfDataType.kAmfAsyncMessage, className, parent, transactionId); initCorrelationId(message.getCorrelationId()); } public AmfAsyncMessage(final String name, final boolean externalizable, final AbstractAmfDataContainer<?> parent, final int transactionId) { super(name, AmfDataType.kAmfAsyncMessage, externalizable, parent, transactionId); initCorrelationId(""); } private AmfPrimitiveData getCorrelationId() { return (AmfPrimitiveData) properties.get(correlationIdName).getValueData(); } private void initCorrelationId(final String value) { addFixedField(correlationIdName, new AmfPrimitiveData(correlationIdName, value.getBytes(), this, getTransactionId(), true), true); } @Override public void writeExternal(final AmfOutputStream outputStream) throws IOException { super.writeExternal(outputStream); byte[] correlationIdBytes = UUIDUtils.toByteArray(getCorrelationId().getValue()); short flags = 0; if (getCorrelationId() != null && correlationIdBytes == null) { flags |= CORRELATION_ID_FLAG; } if (correlationIdBytes != null) { flags |= CORRELATION_ID_BYTES_FLAG; } outputStream.writeByte(flags); if (correlationIdBytes == null) { getCorrelationId().writeBytes(outputStream); } else { AmfByteArray aba = new AmfByteArray("Correlation ID", correlationIdBytes, this, getTransactionId()); aba.writeBytes(outputStream); } } // @Override // protected ArrayList<String> getParameterNames() // { // ArrayList<String> names = super.getParameterNames(); // names.add(correlationIdName); // return names; // } }