package com.grendelscan.commons.flex.messages; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.NotImplementedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.grendelscan.commons.flex.AbstractAmfData; import com.grendelscan.commons.flex.AbstractAmfDataContainer; import com.grendelscan.commons.flex.AmfOutputStream; import com.grendelscan.commons.flex.AmfPrimitiveData; import com.grendelscan.commons.flex.complexTypes.AmfActionMessageRoot; import com.grendelscan.commons.flex.dataTypeDefinitions.AmfDataType; import com.grendelscan.commons.flex.output.AmfOutputStreamRegistry; import com.grendelscan.commons.http.dataHandling.data.Data; import com.grendelscan.commons.http.dataHandling.references.DataReference; import com.grendelscan.commons.http.dataHandling.references.NameOrValueReference; import com.grendelscan.commons.http.dataHandling.references.NamedDataContainerDataReference; import com.grendelscan.commons.http.dataHandling.references.amf.AmfActionMessageHeaderComponentReference; import com.grendelscan.commons.flex.AmfUtils; import flex.messaging.io.amf.MessageHeader; public class AmfActionMessageHeader extends AbstractAmfDataContainer<AmfActionMessageHeaderComponentReference> { private static final Logger LOGGER = LoggerFactory.getLogger(AmfActionMessageHeader.class); /** * */ private static final long serialVersionUID = 1L; private AmfPrimitiveData mustUnderstand; private AbstractAmfData data; public AmfActionMessageHeader(MessageHeader header, AbstractAmfDataContainer<?> parent, int transactionId, AmfActionMessageRoot amfRoot) { super(header.getName(), AmfDataType.kActionMessageHeader, parent, false, transactionId); mustUnderstand = new AmfPrimitiveData("Must understand", header.getMustUnderstand(), this, transactionId, true); mustUnderstand.setTypeLocked(true); data = AmfUtils.parseAmfData(header.getData(), parent, transactionId, true); } public AmfActionMessageHeader(String name, AbstractAmfDataContainer<?> parent, int transactionId, AmfActionMessageRoot amfRoot) { super(name, AmfDataType.kActionMessageHeader, parent, false, transactionId); mustUnderstand = new AmfPrimitiveData("Must understand", false, this, transactionId, true); mustUnderstand.setTypeLocked(true); } /* TODO UCdetector: Remove unused code: public AmfActionMessageHeader(String name, boolean mustUnderstand, AbstractAmfData data, AbstractAmfData parent) { super(name, AmfDataType.kActionMessageHeader, parent); this.mustUnderstand = new AmfPrimitiveData("Must understand", mustUnderstand, this); this.mustUnderstand.setTypeLocked(true); this.data = data; } */ @Override public ArrayList<AbstractAmfData> getChildren() { ArrayList<AbstractAmfData> children = new ArrayList<AbstractAmfData>(1); children.add(data); return children; } public AbstractAmfData getData() { return data; } public void setData(AbstractAmfData data) { this.data = data; } /* (non-Javadoc) * @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#getDataChildren() */ @Override public Data[] getDataChildren() { return new Data[] {mustUnderstand, data}; } /* (non-Javadoc) * @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#removeChild(com.grendelscan.commons.http.dataHandling.data.Data) */ @Override public void removeChild(@SuppressWarnings("unused") Data child) { throw new NotImplementedException("Can't remove anything from AMF Action Message Header"); } /* (non-Javadoc) * @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#getChild(com.grendelscan.commons.http.dataHandling.references.DataReference) */ @Override public Data getChild(AmfActionMessageHeaderComponentReference reference) { if (reference.isData()) return data; return mustUnderstand; } /* (non-Javadoc) * @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#getChildUnsafeType(com.grendelscan.commons.http.dataHandling.references.DataReference) */ @Override public Data getChildUnsafeType(DataReference reference) { return getChild((AmfActionMessageHeaderComponentReference) reference); } /* (non-Javadoc) * @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#replaceChild(com.grendelscan.commons.http.dataHandling.references.DataReference, com.grendelscan.commons.http.dataHandling.data.Data) */ @Override public void replaceChild(AmfActionMessageHeaderComponentReference reference, Data child) { if (reference.isData()) { data = (AbstractAmfData) child; } else { mustUnderstand = (AmfPrimitiveData) child; } } /* (non-Javadoc) * @see com.grendelscan.commons.http.dataHandling.data.Data#writeBytes(java.io.OutputStream) */ @Override public void writeBytes(OutputStream out) { AmfOutputStream outputStream = AmfOutputStreamRegistry.getStream(out); try { AmfUtils.writeAMFUTF(outputStream, true, getName(), useAmf3Code); mustUnderstand.writeBytes(out); outputStream.writeInt(UNKNOWN_CONTENT_LENGTH); } catch (IOException e) { LOGGER.error("Weird problem writing AMF: " + e.toString(), e); } data.writeBytes(out); } /* (non-Javadoc) * @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#childrenDebugString() */ @Override public String childrenDebugString() { return data.debugString(); } /* (non-Javadoc) * @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#getChildsReference(com.grendelscan.commons.http.dataHandling.data.Data) */ @Override public AmfActionMessageHeaderComponentReference getChildsReference(Data child) { if (child == mustUnderstand) { return AmfActionMessageHeaderComponentReference.MUST_UNDERSTAND; } else if (child == data) { return AmfActionMessageHeaderComponentReference.DATA; } throw new IllegalArgumentException("The passed data object is not a child of this container"); } }