package com.grendelscan.commons.flex;
import java.io.IOException;
import java.util.ArrayList;
import com.grendelscan.commons.flex.dataTypeDefinitions.AmfConstants;
import com.grendelscan.commons.flex.dataTypeDefinitions.AmfDataType;
import com.grendelscan.commons.http.dataHandling.data.AbstractData;
public abstract class AbstractAmfData extends AbstractData
{
private static final long serialVersionUID = 1L;
private String name;
private AmfDataType type;
protected final static int UNKNOWN_CONTENT_LENGTH = -1;
protected boolean typeLocked = false;
protected boolean nameLocked = false;
protected boolean valueLocked = false;
protected boolean deletable = false;
protected boolean useAmf3Code;
protected boolean amf3Parent;
protected boolean forceAmf3Code;
// protected AbstractAmfData(String name, AmfDataType type, boolean amf3Parent, boolean useAmf3Code,
// AbstractAmfDataContainer<?> parent, DataReference reference, int transactionId)
// {
// super(parent, reference, transactionId);
// this.name = name;
// this.type = type;
// this.useAmf3Code = useAmf3Code;
// this.amf3Parent = amf3Parent;
// }
protected AbstractAmfData(final String name, final AmfDataType type, final AbstractAmfDataContainer<?> parent, final boolean forceAmf3Code, final int transactionId)
{
super(parent, transactionId);
this.name = name;
this.type = type;
this.forceAmf3Code = forceAmf3Code;
if (parent != null)
{
amf3Parent = parent.isUseAmf3Code();
}
else
{
amf3Parent = false;
}
useAmf3Code = forceAmf3Code || amf3Parent || type.getAmf3Code() == AmfConstants.a3ObjectType;
}
@Override
public String debugString()
{
StringBuilder sb = new StringBuilder();
sb.append("Name: ");
sb.append(name);
sb.append("\nType: ");
sb.append(type.toString());
sb.append("\ntypeLocked: ");
sb.append(typeLocked);
sb.append("\nnameLocked: ");
sb.append(nameLocked);
sb.append("\nvalueLocked: ");
sb.append(valueLocked);
sb.append("\ndeletable: ");
sb.append(deletable);
sb.append("\nuseAmf3Code: ");
sb.append(useAmf3Code);
sb.append("\namf3Parent: ");
sb.append(amf3Parent);
sb.append("\nforceAmf3Code: ");
sb.append(forceAmf3Code);
return null;
}
public abstract ArrayList<AbstractAmfData> getChildren();
public String getName()
{
return name;
}
public AmfDataType getType()
{
return type;
}
public boolean isDeletable()
{
return deletable;
}
public boolean isNameLocked()
{
return nameLocked;
}
public boolean isTypeLocked()
{
return typeLocked;
}
public boolean isUseAmf3Code()
{
return useAmf3Code;
}
public boolean isValueLocked()
{
return valueLocked;
}
public void setDeletable(final boolean deletable)
{
this.deletable = deletable;
}
public void setName(final String name)
{
this.name = name;
}
public void setNameLocked(final boolean nameLocked)
{
this.nameLocked = nameLocked;
}
protected void setParent(final AbstractAmfDataContainer<?> parent)
{
super.setParent(parent);
if (parent != null)
{
amf3Parent = parent.isUseAmf3Code();
}
else
{
amf3Parent = false;
}
useAmf3Code = forceAmf3Code || amf3Parent || type.getAmf3Code() == AmfConstants.a3ObjectType;
}
public void setType(final AmfDataType type)
{
this.type = type;
}
// public abstract void writeBytesToStream(AmfOutputStream outputStream) throws IOException;
public void setTypeLocked(final boolean typeLocked)
{
this.typeLocked = typeLocked;
}
public void setValueLocked(final boolean valueLocked)
{
this.valueLocked = valueLocked;
}
public void writeCodeToStream(final AmfOutputStream outputStream) throws IOException
{
if (useAmf3Code && !outputStream.isAmf3Active())
{
outputStream.write(AmfConstants.kAvmPlusObjectType);
outputStream.setAmf3Active(true);
}
type.writeCode(outputStream, useAmf3Code);
}
}