/**
*
*/
package com.grendelscan.commons.http.dataHandling;
import org.apache.commons.lang.NotImplementedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.grendelscan.commons.http.dataHandling.containers.DataContainer;
import com.grendelscan.commons.http.dataHandling.containers.EncodedDataContainer;
import com.grendelscan.commons.http.dataHandling.containers.UrlEncodedQueryStringDataContainer;
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.formatting.DataFormat;
import com.grendelscan.commons.formatting.DataFormatException;
import com.grendelscan.commons.formatting.DataFormatUtils;
/**
* @author david
*
*/
public class DataParser
{
private static final Logger LOGGER = LoggerFactory.getLogger(DataParser.class);
public static Data parseRawData(byte[] data, DataContainer parent, DataFormat format, int transactionId, boolean mutable)
{
if ((data == null || data.length == 0) && format == null)
{
return new ByteData(parent, new byte[0], transactionId, mutable);
}
if (format == null)
{
try
{
format = DataFormatUtils.getDataFormat(data, null);
}
catch (DataFormatException e1)
{
LOGGER.warn("Couldn't figure out data format. Using raw bytes", e1);
return new ByteData(parent, data, transactionId, mutable);
}
}
if (format.formatType.isEncodeable())
{
try
{
return new EncodedDataContainer(parent, data, format, transactionId, mutable);
}
catch (DataFormatException e)
{
LOGGER.warn("Problem parsing encoded data of type " + format.formatType.getName() + ": " + e.toString(), e);
return new ByteData(parent, data, transactionId, mutable);
}
}
if(format.formatType.isContainer())
{
return parseContainer(data, format, parent, transactionId, mutable);
}
return new ByteData(parent, data, transactionId, mutable); // The default for all base data types
}
public static Data parseRawData(byte[] data, DataContainer parent, String mimeType, int transactionId, boolean mutable)
{
DataFormat format;
if ((data == null || data.length == 0) && (mimeType == null || mimeType.isEmpty()))
{
return new ByteData(parent, new byte[0], transactionId, mutable);
}
try
{
format = DataFormatUtils.getDataFormat(data, mimeType);
}
catch (DataFormatException e1)
{
LOGGER.warn("Couldn't figure out data format. Using raw bytes", e1);
return new ByteData(parent, data, transactionId, mutable);
}
return parseRawData(data, parent, format, transactionId, mutable);
}
private static DataContainer<?> parseContainer(byte[] data, DataFormat format, DataContainer<?> parent, int transactionId, boolean mutable)
{
switch(format.formatType)
{
case URL_ENCODED_QUERY_STRING:
return new UrlEncodedQueryStringDataContainer(parent, data, transactionId, mutable);
default:
LOGGER.warn("Problem with fall-through");
}
throw new NotImplementedException("Why isn't the " + format.formatType.getName() + " container implemented here??");
}
}