/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.network.http;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.util.EncodingUtils;
import com.galaxy.meetup.server.client.domain.GenericJson;
/**
*
* @author sihai
*
*/
public class JsonHttpEntity extends AbstractHttpEntity {
private static final byte BOUNDARY_HYPHEN_BYTES[] = EncodingUtils.getAsciiBytes("--");
private static final byte CONTENT_TYPE_BYTES[] = EncodingUtils.getAsciiBytes("Content-Type: ");
private static final byte CRLF_BYTES[] = EncodingUtils.getAsciiBytes("\r\n");
private static final byte DEFAULT_BOUNDARY_BYTES[] = "onetwothreefourfivesixseven".getBytes();
private final byte mPayloadBytes[];
private final GenericJson mRequest;
public JsonHttpEntity(GenericJson genericjson)
{
this(genericjson, null);
}
public JsonHttpEntity(GenericJson genericjson, byte[] payloadBytes)
{
mRequest = genericjson;
mPayloadBytes = payloadBytes;
if(mPayloadBytes == null)
{
setContentType("application/octet-stream");
setContentEncoding("gzip");
} else
{
setContentType("multipart/related");
}
}
private static void writeBoundary(OutputStream outputstream, boolean flag)
throws IOException
{
outputstream.write(BOUNDARY_HYPHEN_BYTES);
outputstream.write(DEFAULT_BOUNDARY_BYTES);
if(flag)
outputstream.write(BOUNDARY_HYPHEN_BYTES);
outputstream.write(CRLF_BYTES);
}
private static void writeMetaData(OutputStream outputstream, byte[] metadataBytes) throws IOException
{
outputstream.write(CONTENT_TYPE_BYTES);
outputstream.write(EncodingUtils.getAsciiBytes("application/json; charset=UTF-8"));
outputstream.write(CRLF_BYTES);
outputstream.write(CRLF_BYTES);
outputstream.write(metadataBytes);
outputstream.write(CRLF_BYTES);
}
private static void writePayload(OutputStream outputstream, byte[] payloadBytes) throws IOException
{
outputstream.write(CONTENT_TYPE_BYTES);
outputstream.write(EncodingUtils.getAsciiBytes("image/jpeg"));
outputstream.write(CRLF_BYTES);
outputstream.write("Content-Transfer-Encoding: binary".getBytes());
outputstream.write(CRLF_BYTES);
outputstream.write(CRLF_BYTES);
outputstream.write(payloadBytes);
outputstream.write(CRLF_BYTES);
}
public final InputStream getContent() throws IOException
{
ByteArrayInputStream bytearrayinputstream;
if(mRequest == null)
bytearrayinputstream = new ByteArrayInputStream(new byte[0]);
else
if(mPayloadBytes == null)
{
bytearrayinputstream = new ByteArrayInputStream(mRequest.toByteArray());
} else
{
ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();
writeBoundary(bytearrayoutputstream, false);
writeMetaData(bytearrayoutputstream, mRequest.toByteArray());
writeBoundary(bytearrayoutputstream, false);
writePayload(bytearrayoutputstream, mPayloadBytes);
writeBoundary(bytearrayoutputstream, true);
bytearrayinputstream = new ByteArrayInputStream(bytearrayoutputstream.toByteArray());
}
return bytearrayinputstream;
}
public final long getContentLength()
{
return -1L;
}
public final boolean isRepeatable()
{
return true;
}
public final boolean isStreaming()
{
return false;
}
public final void writeTo(OutputStream outputstream) throws IOException
{
if(mRequest != null && mPayloadBytes != null)
{
BufferedOutputStream bufferedoutputstream = new BufferedOutputStream(outputstream);
writeBoundary(bufferedoutputstream, false);
writeMetaData(bufferedoutputstream, mRequest.toByteArray());
writeBoundary(bufferedoutputstream, false);
writePayload(bufferedoutputstream, mPayloadBytes);
writeBoundary(bufferedoutputstream, true);
bufferedoutputstream.flush();
bufferedoutputstream.close();
} else
if(mRequest != null)
{
GZIPOutputStream gzipoutputstream = new GZIPOutputStream(new BufferedOutputStream(outputstream));
gzipoutputstream.write(mRequest.toByteArray());
gzipoutputstream.close();
} else
{
throw new IllegalArgumentException("A mRequest was not found!");
}
}
}