package com.grendelscan.commons.flex.arrays;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
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.AbstractAmfNamedDataContainer;
import com.grendelscan.commons.flex.AmfOutputStream;
import com.grendelscan.commons.flex.NamedAmfDataContainer;
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.data.DataUtils;
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.flex.AmfUtils;
public class AmfAssociativeArrayData extends AbstractAmfNamedDataContainer
{
private static final Logger LOGGER = LoggerFactory.getLogger(AmfAssociativeArrayData.class);
/**
*
*/
private static final long serialVersionUID = 1L;
public AmfAssociativeArrayData(String name, AbstractAmfDataContainer<?> parent, int transactionId)
{
super(name, AmfDataType.kAssociativeArray, parent, false, transactionId);
}
public AmfAssociativeArrayData(String name, Map<?, ?> map, AbstractAmfDataContainer<?> parent, int transactionId)
{
this(name, parent, transactionId);
if (map != null)
{
for (Object o: map.keySet())
{
AbstractAmfData amfObject = AmfUtils.parseAmfData(map.get(o), parent, transactionId, true);
amfObject.setName(o.toString());
NamedAmfDataContainer container = new NamedAmfDataContainer(this, getTransactionId(), o.toString(), amfObject);
properties.put(o.toString().getBytes(), container);
amfObject.setDeletable(true);
}
}
}
@Override
public void writeBytes(OutputStream out)
{
AmfOutputStream outputStream = AmfOutputStreamRegistry.getStream(out);
try
{
writeCodeToStream(outputStream);
AmfUtils.writeUInt29(outputStream, (0 << 1) | 1);
for (byte[] name: properties.getSortedKeys())
{
// NamedAmfDataContainer container = properties.get(name);
Data value = properties.get(name);
// container.getValueData().writeBytes(out);
AmfUtils.writeAMFUTF(outputStream, false, new String(DataUtils.getBytes(value)), useAmf3Code);
value.writeBytes(outputStream);
}
AmfUtils.writeAMFUTF(outputStream, false, "", useAmf3Code);
}
catch (IOException e)
{
LOGGER.error("Problem writing AMF: " + e.toString(), e);
}
}
@Override
public boolean isValueLocked()
{
return true;
}
}