package com.grendelscan.commons.flex;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.grendelscan.commons.flex.dataTypeDefinitions.AmfDataType;
import com.grendelscan.commons.flex.output.AmfOutputStreamRegistry;
import com.grendelscan.commons.http.dataHandling.containers.DataContainer;
import com.grendelscan.commons.http.dataHandling.data.ByteData;
import com.grendelscan.commons.http.dataHandling.data.Data;
import com.grendelscan.commons.http.dataHandling.references.DataReference;
import com.grendelscan.commons.http.dataHandling.references.SingleChildReference;
public class AmfPrimitiveData extends AbstractAmfData implements DataContainer<SingleChildReference>
{
private static final Logger LOGGER = LoggerFactory.getLogger(AmfPrimitiveData.class);
/**
*
*/
private static final long serialVersionUID = 1L;
private Data data;
public AmfPrimitiveData(final String name, final AmfDataType type, final byte[] data, final AbstractAmfDataContainer<?> parent, final int transactionId, final boolean mutable)
{
super(name, type, parent, false, transactionId);
this.data = new ByteData(parent, data, transactionId, mutable);
}
public AmfPrimitiveData(final String name, final boolean data, final AbstractAmfDataContainer<?> parent, final int transactionId, final boolean mutable)
{
super(name, data ? AmfDataType.kTrue : AmfDataType.kFalse, parent, false, transactionId);
this.data = new ByteData(parent, Boolean.toString(data).getBytes(), transactionId, mutable);
}
/*
* TODO UCdetector: Remove unused code: public AmfPrimitiveData(String name, byte[] data, AbstractAmfData parent) { super(name, AmfDataType.kByteArray, parent); this.data = new String(data,
* StringUtils.getDefaultCharset()); }
*/
public AmfPrimitiveData(final String name, final byte[] data, final AbstractAmfDataContainer<?> parent, final int transactionId, final boolean mutable)
{
super(name, AmfDataType.kString, parent, false, transactionId);
this.data = new ByteData(parent, data, transactionId, mutable);
}
public AmfPrimitiveData(final String name, final double data, final AbstractAmfDataContainer<?> parent, final int transactionId, final boolean mutable)
{
super(name, AmfDataType.kDouble, parent, false, transactionId);
this.data = new ByteData(parent, Double.toString(data).getBytes(), transactionId, mutable);
}
public AmfPrimitiveData(final String name, final int data, final AbstractAmfDataContainer<?> parent, final int transactionId, final boolean mutable)
{
super(name, AmfDataType.kInteger, parent, false, transactionId);
this.data = new ByteData(parent, Integer.toString(data).getBytes(), transactionId, mutable);
}
/*
* (non-Javadoc)
*
* @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#childrenDebugString()
*/
@Override
public String childrenDebugString()
{
return data.debugString();
}
// int kUndefinedType = 0;
// int kNullType = 1;
// int kFalseType = 2;
// int kTrueType = 3;
// int kXMLType = 7;
// int kDateType = 8;
// int kArrayType = 9;
// int kObjectType = 10;
// int kAvmPlusXmlType = 11;
// int kByteArrayType = 12;
/*
* (non-Javadoc)
*
* @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#getChild(com.grendelscan.commons.http.dataHandling.references.DataReference)
*/
@Override
public Data getChild(final SingleChildReference reference)
{
return data;
}
@Override
public ArrayList<AbstractAmfData> getChildren()
{
return null;
}
/*
* (non-Javadoc)
*
* @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#getChildsReference(com.grendelscan.commons.http.dataHandling.data.Data)
*/
@Override
public SingleChildReference getChildsReference(final Data child)
{
if (child == data)
{
return SingleChildReference.getInstance();
}
throw new IllegalArgumentException("The passed data object is not a child of this container");
}
/*
* (non-Javadoc)
*
* @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#getChildUnsafeType(com.grendelscan.commons.http.dataHandling.references.DataReference)
*/
@Override
public Data getChildUnsafeType(final DataReference reference)
{
return data;
}
/*
* (non-Javadoc)
*
* @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#getDataChildren()
*/
@Override
public Data[] getDataChildren()
{
return new Data[] { data };
}
public String getValue()
{
return toString();
}
@Override
public boolean isValueLocked()
{
return getType().equals(AmfDataType.kNull) ? true : super.isValueLocked();
}
/*
* (non-Javadoc)
*
* @see com.grendelscan.commons.http.dataHandling.containers.DataContainer#removeChild(com.grendelscan.commons.http.dataHandling.data.Data)
*/
@Override
public void removeChild(final Data child)
{
throw new IllegalArgumentException("Remove child doesn't make sense for a primitive data type");
}
/*
* (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(final SingleChildReference reference, final Data child)
{
data = child;
}
public void setValue(final String data)
{
this.data = new ByteData(this, data.getBytes(), this.data.getTransactionId(), true);
}
@Override
public String toString()
{
return data.toString();
}
@Override
public void writeBytes(final OutputStream out)
{
AmfOutputStream outputStream = AmfOutputStreamRegistry.getStream(out);
if (data == null)
{
setType(AmfDataType.kNull);
}
try
{
// null, true and false are only data types, no real data
switch (getType())
{
case kDouble:
writeCodeToStream(outputStream);
outputStream.writeDouble(Double.valueOf(toString()));
break;
case kInteger:
AmfUtils.writeAMFInt(outputStream, Integer.valueOf(toString()), useAmf3Code);
break;
case kString:
case kXML:
case kAvmPlusXml:
// if (data.equals(""))
// {
// AmfDataType.kNull.writeCode(outputStream, useAmf3Code);
// }
// else
// {
writeCodeToStream(outputStream);
AmfUtils.writeAMFUTF(outputStream, false, data.toString(), useAmf3Code);
// }
break;
case kTrue:
case kFalse:
case kBoolean:
AmfUtils.writeBoolean(outputStream, Boolean.valueOf(toString()), useAmf3Code);
break;
// for null
default:
writeCodeToStream(outputStream);
}
}
catch (IOException e)
{
LOGGER.error("Problem writing AMF: " + e.toString(), e);
}
}
}