package ddth.dasp.hetty.message.protobuf; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.google.protobuf.ByteString; import ddth.dasp.hetty.message.ICookie; import ddth.dasp.hetty.message.IResponse; import ddth.dasp.hetty.message.protobuf.HettyProtoBuf.NameValue; public class ProtoBufResponse implements IResponse { private boolean dirty = false; // private List<ICookie> cookies; private Map<String, String> headers; private HettyProtoBuf.ResponseOrBuilder response; public ProtoBufResponse(HettyProtoBuf.Response response) { this.response = response; } public ProtoBufResponse(HettyProtoBuf.Response.Builder responseBuilder) { this.response = responseBuilder; } private HettyProtoBuf.Response.Builder ensureBuilder() { if (response instanceof HettyProtoBuf.Response) { response = HettyProtoBuf.Response.newBuilder((HettyProtoBuf.Response) response); } return (HettyProtoBuf.Response.Builder) response; } /** * {@inheritDoc} */ @Override public byte[] serialize() { refresh(); if (response instanceof HettyProtoBuf.Response) { return ((HettyProtoBuf.Response) response).toByteArray(); } if (response instanceof HettyProtoBuf.Response.Builder) { HettyProtoBuf.Response.Builder builder = ((HettyProtoBuf.Response.Builder) response) .clone(); return builder.build().toByteArray(); } return null; } private void refresh() { if (dirty) { if (headers != null && headers.size() > 0) { HettyProtoBuf.Response.Builder builder = ensureBuilder(); builder.clearHeaders(); for (Entry<String, String> header : headers.entrySet()) { HettyProtoBuf.NameValue nameValue = HettyProtoBuf.NameValue.newBuilder() .setName(header.getKey()).setValue(header.getValue()).build(); builder.addHeaders(nameValue); } } } dirty = false; } /** * {@inheritDoc} */ @Override public String getRequestId() { return response.hasRequestId() ? response.getRequestId() : null; } /** * {@inheritDoc} */ @Override public long getRequestTimestampNano() { return response.hasRequestTimestampNano() ? response.getRequestTimestampNano() : 0; } /** * {@inheritDoc} */ @Override public int getChannelId() { return response.hasChannelId() ? response.getChannelId() : 0; } /** * {@inheritDoc} */ @Override public int getStatus() { return response.hasStatus() ? response.getStatus() : 0; } /** * {@inheritDoc} */ @Override public ProtoBufResponse setStatus(int status) { HettyProtoBuf.Response.Builder builder = ensureBuilder(); builder.setStatus(status); return this; } /** * {@inheritDoc} */ @Override public ProtoBufResponse addCookie(ICookie cookie) { HettyProtoBuf.Cookie.Builder cookieBuilder = HettyProtoBuf.Cookie.newBuilder(); cookieBuilder.setDomain(cookie.getDomain()); cookieBuilder.setMaxAge(cookie.getMaxAge()); cookieBuilder.setName(cookie.getName()); cookieBuilder.setPath(cookie.getPath()); cookieBuilder.setPort(cookie.getPort()); cookieBuilder.setValue(cookie.getValue()); HettyProtoBuf.Response.Builder builder = ensureBuilder(); builder.addCookies(cookieBuilder.build()); return this; } /** * {@inheritDoc} */ @Override public ICookie[] getCookies() { // if (cookies == null) { List<ICookie> cookies = new ArrayList<ICookie>(); List<HettyProtoBuf.Cookie> cookieList = response.getCookiesList(); if (cookieList != null) { for (HettyProtoBuf.Cookie cookie : cookieList) { cookies.add(new ProtoBufCookie(cookie)); } } // } return cookies.toArray(new ICookie[0]); } /** * {@inheritDoc} */ @Override public ProtoBufResponse addHeader(String name, String value) { Map<String, String> headers = getHeaders(); headers.put(name, value); dirty = true; return this; // HettyProtoBuf.NameValue header = // HettyProtoBuf.NameValue.newBuilder().setName(name) // .setValue(value).build(); // HettyProtoBuf.Response.Builder builder = ensureBuilder(); // builder.addHeaders(header); // return this; } /** * {@inheritDoc} */ @Override public ProtoBufResponse addHeader(String name, Date value) { Map<String, String> headers = getHeaders(); headers.put(name, ResponseUtils.DF_HEADER.format(value)); dirty = true; return this; // HettyProtoBuf.NameValue header = // HettyProtoBuf.NameValue.newBuilder().setName(name) // .setValue(ResponseUtils.DF_HEADER.format(value)).build(); // HettyProtoBuf.Response.Builder builder = ensureBuilder(); // builder.addHeaders(header); // return this; } /** * {@inheritDoc} */ @Override public ProtoBufResponse addHeader(String name, int value) { Map<String, String> headers = getHeaders(); headers.put(name, String.valueOf(value)); dirty = true; return this; // HettyProtoBuf.NameValue header = // HettyProtoBuf.NameValue.newBuilder().setName(name) // .setValue(String.valueOf(value)).build(); // HettyProtoBuf.Response.Builder builder = ensureBuilder(); // builder.addHeaders(header); // return this; } /** * {@inheritDoc} */ @Override public ProtoBufResponse addHeader(String name, long value) { Map<String, String> headers = getHeaders(); headers.put(name, String.valueOf(value)); dirty = true; return this; // HettyProtoBuf.NameValue header = // HettyProtoBuf.NameValue.newBuilder().setName(name) // .setValue(String.valueOf(value)).build(); // HettyProtoBuf.Response.Builder builder = ensureBuilder(); // builder.addHeaders(header); // return this; } /** * {@inheritDoc} */ @Override public Map<String, String> getHeaders() { if (headers == null) { headers = new HashMap<String, String>(); List<HettyProtoBuf.NameValue> headersList = response.getHeadersList(); if (headersList != null) { for (NameValue header : headersList) { headers.put(header.getName(), header.getValue()); } } } return headers; } /** * {@inheritDoc} */ @Override public byte[] getContent() { return response.hasContent() ? response.getContent().toByteArray() : null; } /** * {@inheritDoc} */ @Override public ProtoBufResponse setContent(byte[] content) { ByteString byteStr = ByteString.copyFrom(content); addHeader("Content-Length", byteStr.size()); HettyProtoBuf.Response.Builder builder = ensureBuilder(); builder.setContent(byteStr); return this; } /** * {@inheritDoc} */ @Override public ProtoBufResponse setContent(String content) { ByteString byteStr = ByteString.copyFromUtf8(content); addHeader("Content-Length", byteStr.size()); HettyProtoBuf.Response.Builder builder = ensureBuilder(); builder.setContent(byteStr); return this; } /** * {@inheritDoc} */ @Override public boolean isChunk() { return response.hasIsChunk() ? response.getIsChunk() : false; } /** * {@inheritDoc} */ @Override public int getChunkSequence() { return response.hasChunkSeq() ? response.getChunkSeq() : 0; } }