/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.threetier.platypus; import com.eas.client.report.Report; import com.eas.client.threetier.Response; import com.eas.client.threetier.requests.AccessControlExceptionResponse; import com.eas.client.threetier.requests.AppQueryRequest; import com.eas.client.threetier.requests.CommitRequest; import com.eas.client.threetier.requests.ServerModuleStructureRequest; import com.eas.client.threetier.requests.DisposeServerModuleRequest; import com.eas.client.threetier.requests.ExceptionResponse; import com.eas.client.threetier.requests.ExecuteQueryRequest; import com.eas.client.threetier.requests.RPCRequest; import com.eas.client.threetier.requests.LogoutRequest; import com.eas.client.threetier.requests.ModuleStructureRequest; import com.eas.client.threetier.requests.PlatypusResponseVisitor; import com.eas.client.threetier.requests.ResourceRequest; import com.eas.client.threetier.requests.CredentialRequest; import com.eas.client.threetier.requests.JsonExceptionResponse; import com.eas.client.threetier.requests.SqlExceptionResponse; import com.eas.proto.CoreTags; import com.eas.proto.ProtoWriter; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * * @author mg */ public class PlatypusResponseWriter implements PlatypusResponseVisitor { public static final int COMPRESS_TOLERANCE = 1024 * 2;// 2KB public static final String ZIP_ENTRY_NAME = "responseData"; protected OutputStream out; public PlatypusResponseWriter(OutputStream aOut) { super(); out = aOut; } public static void write(Response response, ProtoWriter writer) throws Exception { if (response instanceof SqlExceptionResponse) { writer.put(RequestsTags.TAG_SQL_ERROR_RESPONSE); } else if (response instanceof JsonExceptionResponse) { writer.put(RequestsTags.TAG_JSON_ERROR_RESPONSE); } else if (response instanceof AccessControlExceptionResponse) { writer.put(RequestsTags.TAG_ACCESS_CONTROL_ERROR_RESPONSE); } else if (response instanceof ExceptionResponse) { writer.put(RequestsTags.TAG_ERROR_RESPONSE); } else { writer.put(RequestsTags.TAG_RESPONSE); } writer.put(RequestsTags.TAG_RESPONSE_DATA); ByteArrayOutputStream subOut = new ByteArrayOutputStream(); PlatypusResponseWriter responseWriter = new PlatypusResponseWriter(subOut); response.accept(responseWriter); byte[] subOutBytes = subOut.toByteArray(); if (subOutBytes.length > COMPRESS_TOLERANCE) { ByteArrayOutputStream zSubOut = new ByteArrayOutputStream(); try (ZipOutputStream zStream = new ZipOutputStream(zSubOut)) { ZipEntry ze = new ZipEntry(ZIP_ENTRY_NAME); zStream.putNextEntry(ze); zStream.write(subOutBytes); zStream.flush(); } writer.put(CoreTags.TAG_COMPRESSED_STREAM, zSubOut.toByteArray()); } else { writer.put(CoreTags.TAG_STREAM, subOutBytes); } writer.put(RequestsTags.TAG_RESPONSE_END); writer.flush(); } @Override public void visit(ExceptionResponse rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_RESPONSE_ERROR, rsp.getErrorMessage()); writer.flush(); } @Override public void visit(SqlExceptionResponse rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_RESPONSE_ERROR, rsp.getErrorMessage()); assert rsp.getSqlErrorCode() != null || rsp.getSqlState() != null : "SqlExceptionResponse without sqlCode and sqlState detected"; if (rsp.getSqlErrorCode() != null) { writer.put(RequestsTags.TAG_RESPONSE_SQL_ERROR_CODE, rsp.getSqlErrorCode()); } if (rsp.getSqlState() != null) { writer.put(RequestsTags.TAG_RESPONSE_SQL_ERROR_STATE, rsp.getSqlState()); } writer.flush(); } @Override public void visit(AccessControlExceptionResponse rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_RESPONSE_ERROR, rsp.getErrorMessage()); writer.put(RequestsTags.TAG_RESPONSE_ACCESS_CONTROL); if (rsp.isNotLoggedIn()) { writer.put(RequestsTags.TAG_RESPONSE_ACCESS_CONTROL_NOT_LOGGED_IN); } writer.flush(); } @Override public void visit(JsonExceptionResponse rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_RESPONSE_ERROR, rsp.getErrorMessage()); writer.put(RequestsTags.TAG_RESPONSE_JSON, rsp.getJsonContent()); writer.flush(); } @Override public void visit(CredentialRequest.Response rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); if (rsp.getName() != null) { writer.put(CoreTags.TAG_USER_NAME, rsp.getName()); } writer.flush(); } @Override public void visit(ExecuteQueryRequest.Response rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); if (rsp.getJson() != null) { writer.put(RequestsTags.TAG_RESULT_VALUE, rsp.getJson()); } } @Override public void visit(LogoutRequest.Response rsp) throws Exception { } @Override public void visit(RPCRequest.Response rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); if (rsp.getResult() instanceof Report) { Report report = (Report) rsp.getResult(); writer.put(RequestsTags.TAG_FILE_NAME, report.getName()); writer.put(RequestsTags.TAG_FORMAT, report.getFormat()); writer.put(RequestsTags.TAG_RESULT_VALUE, report.getBody()); } else { writer.put(RequestsTags.TAG_RESULT_VALUE, (String) rsp.getResult()); } writer.flush(); } @Override public void visit(DisposeServerModuleRequest.Response rsp) throws Exception { } @Override public void visit(CommitRequest.Response rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.UPDATED_TAG, rsp.getUpdated()); writer.flush(); } @Override public void visit(ModuleStructureRequest.Response rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_RESULT_VALUE, rsp.getJson()); writer.flush(); } @Override public void visit(AppQueryRequest.Response rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); if (rsp.getAppQueryJson() != null) { assert rsp.getTimeStamp() != null; writer.put(RequestsTags.TAG_TIMESTAMP, rsp.getTimeStamp()); writer.put(RequestsTags.TAG_RESULT_VALUE, rsp.getAppQueryJson()); writer.flush(); } } @Override public void visit(ResourceRequest.Response rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); if (rsp.getContent() != null) { assert rsp.getTimeStamp() != null; writer.put(RequestsTags.TAG_TIMESTAMP, rsp.getTimeStamp()); writer.put(RequestsTags.TAG_RESOUCRE_CONTENT, rsp.getContent()); } writer.flush(); } @Override public void visit(ServerModuleStructureRequest.Response rsp) throws Exception { ProtoWriter writer = new ProtoWriter(out); if (rsp.getInfoJson() != null) { assert rsp.getTimeStamp() != null; writer.put(RequestsTags.TAG_TIMESTAMP, rsp.getTimeStamp()); writer.put(RequestsTags.TAG_RESULT_VALUE, rsp.getInfoJson()); } writer.flush(); } }