/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.threetier.platypus; import com.eas.client.metadata.Parameter; import com.eas.client.threetier.Request; 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.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.PlatypusRequestVisitor; import com.eas.client.threetier.requests.ResourceRequest; import com.eas.client.threetier.requests.CredentialRequest; import com.eas.proto.CoreTags; import com.eas.proto.ProtoWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Date; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * * @author mg */ public class PlatypusRequestWriter implements PlatypusRequestVisitor { protected OutputStream out; public PlatypusRequestWriter(OutputStream aOut) { super(); out = aOut; } public static void write(Request aRequest, ProtoWriter writer) throws IOException { try { writer.put(RequestsTags.TAG_REQUEST_TYPE, aRequest.getType()); writer.put(RequestsTags.TAG_REQUEST_DATA); ByteArrayOutputStream subOut = new ByteArrayOutputStream(); PlatypusRequestWriter requestsWriter = new PlatypusRequestWriter(subOut); aRequest.accept(requestsWriter); byte[] subOutBytes = subOut.toByteArray(); if (subOutBytes.length > 1024 * 2) { ByteArrayOutputStream zSubOut = new ByteArrayOutputStream(); try (ZipOutputStream zStream = new ZipOutputStream(zSubOut)) { ZipEntry ze = new ZipEntry("requestData"); 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_REQUEST_END); } catch (Exception ex) { throw new IOException(ex); } } @Override public void visit(ModuleStructureRequest rq) throws Exception { ProtoWriter pw = new ProtoWriter(out); pw.put(RequestsTags.TAG_MODULE_NAME, rq.getModuleName()); pw.flush(); } @Override public void visit(AppQueryRequest rq) throws Exception { ProtoWriter pw = new ProtoWriter(out); pw.put(RequestsTags.TAG_QUERY_ID, rq.getQueryName()); if (rq.getTimeStamp() != null) { pw.put(RequestsTags.TAG_TIMESTAMP, rq.getTimeStamp()); } pw.flush(); } @Override public void visit(ResourceRequest rq) throws Exception { ProtoWriter pw = new ProtoWriter(out); pw.put(RequestsTags.TAG_RESOURCE_NAME, rq.getResourceName()); if (rq.getTimeStamp() != null) { pw.put(RequestsTags.TAG_TIMESTAMP, rq.getTimeStamp()); } pw.flush(); } @Override public void visit(ServerModuleStructureRequest rq) throws Exception { ProtoWriter pw = new ProtoWriter(out); pw.put(RequestsTags.TAG_MODULE_NAME, rq.getModuleName()); if (rq.getTimeStamp() != null) { pw.put(RequestsTags.TAG_TIMESTAMP, rq.getTimeStamp()); } pw.flush(); } @Override public void visit(LogoutRequest rq) throws Exception { } @Override public void visit(CommitRequest rq) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_CHANGES, rq.getChangesJson()); writer.flush(); } @Override public void visit(DisposeServerModuleRequest rq) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_MODULE_NAME, rq.getModuleName()); writer.flush(); } @Override public void visit(RPCRequest rq) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_MODULE_NAME, rq.getModuleName()); writer.put(RequestsTags.TAG_METHOD_NAME, rq.getMethodName()); for (String argJson : rq.getArgumentsJsons()) { writer.put(RequestsTags.TAG_ARGUMENT_VALUE, argJson); } writer.flush(); } public static byte[] writeParameter(Parameter aParam) throws IOException { try { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ProtoWriter writer = new ProtoWriter(outStream); writer.put(RequestsTags.TAG_SQL_PARAMETER_NAME, aParam.getName()); writer.put(RequestsTags.TAG_SQL_PARAMETER_TYPE, aParam.getType()); writer.put(RequestsTags.TAG_SQL_PARAMETER_MODE, aParam.getMode()); if (aParam.getDescription() != null) { writer.put(RequestsTags.TAG_SQL_PARAMETER_DESCRIPTION, aParam.getDescription()); } Object paramValue = aParam.getValue(); if (paramValue != null) { if (paramValue instanceof Number) { writer.put(RequestsTags.TAG_SQL_PARAMETER_VALUE, ((Number) paramValue).doubleValue()); } else if (paramValue instanceof Boolean) { writer.put(RequestsTags.TAG_SQL_PARAMETER_VALUE, (Boolean) paramValue); } else if (paramValue instanceof CharSequence) { writer.put(RequestsTags.TAG_SQL_PARAMETER_VALUE, paramValue.toString()); } else if (paramValue instanceof Date) { writer.put(RequestsTags.TAG_SQL_PARAMETER_VALUE, (Date) paramValue); } } writer.flush(); return outStream.toByteArray(); } catch (Exception ex) { throw new IOException(ex); } } @Override public void visit(ExecuteQueryRequest rq) throws Exception { ProtoWriter writer = new ProtoWriter(out); writer.put(RequestsTags.TAG_QUERY_ID, rq.getQueryName()); for (Map.Entry<String, String> pEntry : rq.getParamsJsons().entrySet()) { writer.put(RequestsTags.TAG_SQL_PARAMETER); ByteArrayOutputStream pOut = new ByteArrayOutputStream(); ProtoWriter pWriter = new ProtoWriter(pOut); pWriter.put(RequestsTags.TAG_SQL_PARAMETER_NAME, pEntry.getKey()); pWriter.put(RequestsTags.TAG_SQL_PARAMETER_VALUE, pEntry.getValue()); pWriter.flush(); writer.put(CoreTags.TAG_STREAM, pOut); } writer.flush(); } @Override public void visit(CredentialRequest rq) throws Exception { } }