static public void write()

in ch-sxmp/src/main/java/com/cloudhopper/sxmp/SxmpWriter.java [118:274]


    static public void write(Writer out, Operation operation, boolean withXmlHeader) throws SxmpErrorException, IOException {
        if (withXmlHeader) writeXmlHeader(out, operation);
        writeOperationStartTag(out, operation.getType());

        // let's validate this operation is valid
        operation.validate();

        if (operation instanceof ErrorResponse) {
            // write out just an ErrorResponse
            writeErrorElement(out, (ErrorResponse)operation);

        } else if (operation instanceof Request) {
            // any request requires an account to be printed out
            Request request = (Request)operation;

            if (request.getAccount() != null) {
                out.write(" <account username=\"");
                out.write(StringUtil.escapeXml(request.getAccount().getUsername()));
                out.write("\" password=\"");
                out.write(StringUtil.escapeXml(request.getAccount().getPassword()));
                out.write("\"/>\n");
            }

            if (request.getApplication() != null) {
                out.write(" <application>");
                out.write(StringUtil.escapeXml(request.getApplication().getName()));
                out.write("</application>\n");
            }

            writeRequestResponseStartTag(out, operation);

            // tickets are now supported any any request
            if (request.getTicketId() != null) {
                out.write("  <ticketId>");
                out.write(StringUtil.escapeXml(request.getTicketId()));
                out.write("</ticketId>\n");
            }

            if (operation instanceof DeliveryReportRequest) {
                DeliveryReportRequest deliveryRequest = (DeliveryReportRequest)operation;

                if (deliveryRequest.getStatus() != null) {
                    out.write("  <status code=\"");
                    out.write(deliveryRequest.getStatus().getCode().toString());
                    out.write("\" message=\"");
                    out.write(StringUtil.escapeXml(deliveryRequest.getStatus().getMessage()));
                    out.write("\"/>\n");
                }

                if (deliveryRequest.getMessageErrorCode() != null) {
                    out.write("  <messageError code=\"");
                    out.write(deliveryRequest.getMessageErrorCode().toString());
                    out.write("\"/>\n");
                }

                if (deliveryRequest.getCreateDate() != null) {
                    out.write("  <createDate>");
                    out.write(SxmpParser.dateTimeFormat.print(deliveryRequest.getCreateDate()));
                    out.write("</createDate>\n");
                }

                if (deliveryRequest.getFinalDate() != null) {
                    out.write("  <finalDate>");
                    out.write(SxmpParser.dateTimeFormat.print(deliveryRequest.getFinalDate()));
                    out.write("</finalDate>\n");
                }

            } else if (operation instanceof MessageRequest) {
                MessageRequest messageRequest = (MessageRequest)operation;

                if (messageRequest.getOperatorId() != null) {
                    out.write("  <operatorId>");
                    out.write(messageRequest.getOperatorId().toString());
                    out.write("</operatorId>\n");
                }

                if (messageRequest.getPriority() != null) {
                    out.write("  <priority>");
                    out.write(messageRequest.getPriority().getPriorityFlag().toString());
                    out.write("</priority>\n");
                }

                if (operation instanceof SubmitRequest) {
                    SubmitRequest submitRequest = (SubmitRequest)operation;
                    if (submitRequest.getDeliveryReport() != null) {
                        out.write("  <deliveryReport>");
                        out.write(submitRequest.getDeliveryReport().toString().toLowerCase());
                        out.write("</deliveryReport>\n");
                    }
                }

                if (messageRequest.getSourceAddress() != null) {
                    out.write("  <sourceAddress type=\"");
                    out.write(messageRequest.getSourceAddress().getType().toString().toLowerCase());
                    out.write("\">");
                    out.write(messageRequest.getSourceAddress().getAddress());
                    out.write("</sourceAddress>\n");
                }

                if (messageRequest.getDestinationAddress() != null) {
                    out.write("  <destinationAddress type=\"");
                    out.write(messageRequest.getDestinationAddress().getType().toString().toLowerCase());
                    out.write("\">");
                    // push dest address is not guaranteed to be XML-safe
                    // do minimum-necessary escaping? or better to stay standardized & escape everything?
                    if (messageRequest.getDestinationAddress().getType() == MobileAddress.Type.PUSH_DESTINATION) {
                        out.write(XmlEscapeUtil.escapeTextXml(messageRequest.getDestinationAddress().getAddress()));
                    } else {
                        out.write(messageRequest.getDestinationAddress().getAddress());
                    }
                    out.write("</destinationAddress>\n");
                }

                if (messageRequest.getText() != null) {
                    String charset = messageRequest.getTextEncoding().getCharset();
                    out.write("  <text encoding=\"");
                    out.write(charset);
                    out.write("\">");
                    out.write(HexUtil.toHexString(messageRequest.getText().getBytes(charset)));
                    out.write("</text>\n");
                }

                // this is a v1.1 option; only write if version == 1.1
                if (messageRequest.getOptionalParams() != null &&
                        messageRequest.getVersion().equals(SxmpParser.VERSION_1_1)) {

                    //String charset = messageRequest.getTextEncoding().getCharset();
                    out.write("  <optionalParams>");
                    JSONObject jsonObj = new JSONObject(messageRequest.getOptionalParams());
                    // JSON encoding is not XML-safe
                    // do minimum-necessary escaping? or better to stay standardized & escape everything?
                    // tradeoff: all " and ' become &quot; and &apos; and all json strings are quoted.
                    out.write(XmlEscapeUtil.escapeTextXml(jsonObj.toString()));
                    out.write("</optionalParams>\n");
                }
            }

            writeRequestResponseEndTag(out, operation);
        } else {
            writeRequestResponseStartTag(out, operation);

            writeErrorElement(out, (Response)operation);

            // tickets on responses are now supported for submits or delivers
            if (operation instanceof SubmitResponse || operation instanceof DeliverResponse) {
                if (operation.getTicketId() != null) {
                    out.write("  <ticketId>");
                    out.write(StringUtil.escapeXml(operation.getTicketId()));
                    out.write("</ticketId>\n");
                }
            }

            writeRequestResponseEndTag(out, operation);
        }

        writeOperationEndTag(out);
    }