/**
* Copyright 2012 Comcast Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.comcast.cqs.io;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringEscapeUtils;
import com.comcast.cqs.model.CQSBatchResultErrorEntry;
import com.comcast.cqs.model.CQSMessage;
import com.comcast.cqs.util.CQSConstants;
/**
* API response for messages
* @author baosen, aseem, vvenkatraman, bwolf
*
*/
public class CQSMessagePopulator extends CQSPopulator {
public static String getSendMessageResponse(CQSMessage message) {
StringBuffer out = new StringBuffer("<SendMessageResponse>\n");
out.append("\t<SendMessageResult>\n");
out.append("\t\t<MD5OfMessageBody>").append(message.getMD5OfBody()).append("</MD5OfMessageBody>\n");
if (message.getMD5OfMessageAttributes() != null) {
out.append("\t\t<MD5OfMessageAttributes>").append(message.getMD5OfMessageAttributes()).append("</MD5OfMessageAttributes>\n");
}
out.append("\t\t<MessageId>").append(message.getMessageId()).append("</MessageId>\n");
out.append("\t</SendMessageResult>\n");
out.append("\t").append(getResponseMetadata()).append("\n");
out.append( "</SendMessageResponse>\n");
return out.toString();
}
public static String getSendMessageBatchResponse(List<CQSMessage> messages, List<CQSBatchResultErrorEntry> errorList) {
StringBuffer out = new StringBuffer("<SendMessageBatchResponse>\n");
out.append("\t<SendMessageBatchResult>\n");
for (CQSMessage message: messages) {
out.append("\t\t<SendMessageBatchResultEntry>\n");
out.append("\t\t\t<Id>").append(message.getSuppliedMessageId()).append("</Id>\n");
out.append("\t\t\t<MessageId>").append(message.getMessageId()).append("</MessageId>\n");
out.append("\t\t\t<MD5OfMessageBody>").append(message.getMD5OfBody()).append("</MD5OfMessageBody>\n");
if (message.getMD5OfMessageAttributes() != null) {
out.append("\t\t<MD5OfMessageAttributes>").append(message.getMD5OfMessageAttributes()).append("</MD5OfMessageAttributes>\n");
}
out.append("\t\t</SendMessageBatchResultEntry>\n");
}
if (errorList.size() > 0) {
out.append(getBatchErrorResult(errorList));
}
out.append("\t</SendMessageBatchResult>\n");
out.append("\t").append(getResponseMetadata()).append("\n");
out.append("</SendMessageBatchResponse>\n");
return out.toString();
}
private static String getBatchErrorResult(List<CQSBatchResultErrorEntry> errorList) {
StringBuffer out = new StringBuffer();
for (CQSBatchResultErrorEntry error : errorList) {
out.append("\t\t<BatchResultErrorEntry>\n");
out.append("\t\t\t<Id>").append(error.getId()).append("</Id>\n");
out.append("\t\t\t<SenderFault>").append(error.getSenderFault()).append("</SenderFault>\n");
out.append("\t\t\t<Code>").append(error.getCode()).append("</Code>\n");
out.append("\t\t\t<Message>").append(error.getMessage()).append("</Message>\n");
out.append("\t\t</BatchResultErrorEntry>\n");
}
return out.toString();
}
public static String getDeleteMessageBatchResponse(List<String> ids, List<CQSBatchResultErrorEntry> errorList) {
StringBuffer out = new StringBuffer("<DeleteMessageBatchResponse>\n");
out.append("\t<DeleteMessageBatchResult>\n");
for (String id : ids) {
out.append("\t\t<DeleteMessageBatchResultEntry>\n");
out.append("\t\t\t<Id>").append(id).append("</Id>\n");
out.append("\t\t</DeleteMessageBatchResultEntry>\n");
}
if (errorList.size() > 0) {
out.append(getBatchErrorResult(errorList));
}
out.append("\t</DeleteMessageBatchResult>\n");
out.append("\t").append(getResponseMetadata()).append("\n");
out.append("</DeleteMessageBatchResponse>\n");
return out.toString();
}
public static String getDeleteMessageResponse() {
String out = "<DeleteMessageResponse>\n\t" + getResponseMetadata() + "\n</DeleteMessageResponse>\n";
return out;
}
public static String getPurgeQueueResponse() {
String out = "<PurgeQueueResponse>\n\t" + getResponseMetadata() + "\n</PurgeQueueResponse>\n";
return out;
}
public static String getChangeMessageVisibilityResponse() {
String out = "<ChangeMessageVisibilityResponse>\n\t" + getResponseMetadata() + "</ChangeMessageVisibilityResponse>\n";
return out;
}
public static String getChangeMessageVisibilityBatchResponse(List<String> ids, List<CQSBatchResultErrorEntry> errorList) {
StringBuffer out = new StringBuffer("<ChangeMessageVisibilityBatchResponse>\n");
out.append("\t<ChangeMessageVisibilityBatchResult>\n");
for (String id : ids) {
out.append("\t\t<ChangeMessageVisibilityBatchResultEntry>\n");
out.append("\t\t\t<Id>").append(id).append("</Id>\n");
out.append("\t\t</ChangeMessageVisibilityBatchResultEntry>\n");
}
if (errorList.size() > 0) {
out.append(getBatchErrorResult(errorList));
}
out.append("\t</ChangeMessageVisibilityBatchResult>\n");
out.append("\t").append(getResponseMetadata()).append("\n");
out.append("</ChangeMessageVisibilityBatchResponse>\n");
return out.toString();
}
public static String getReceiveMessageResponseAfterSerializing(List<CQSMessage> messages, List<String> filterAttributs, List<String> filterMessageAttributes) {
StringBuffer out = new StringBuffer("<ReceiveMessageResponse>\n");
out.append("\t<ReceiveMessageResult>\n");
for (CQSMessage message : messages) {
out.append(serializeMessage(message, filterAttributs, filterMessageAttributes));
}
out.append("\t</ReceiveMessageResult>\n");
out.append("\t").append(getResponseMetadata()).append("\n");
out.append("</ReceiveMessageResponse>\n");
return out.toString();
}
public static String serializeMessage(CQSMessage message, List<String> filterAttributes, List<String> filterMessageAttributes) {
StringBuffer attributesXmlFragment = fillAttributesInReturn(message, filterAttributes);
StringBuffer messageXml = new StringBuffer("\t\t<Message>\n");
messageXml.append("\t\t\t<MessageId>").append(message.getMessageId()).append("</MessageId>\n");
messageXml.append("\t\t\t<ReceiptHandle>").append(message.getReceiptHandle()).append("</ReceiptHandle>\n");
messageXml.append("\t\t\t<MD5OfBody>").append(message.getMD5OfBody()).append("</MD5OfBody>\n");
messageXml.append("\t\t\t<Body>").append(StringEscapeUtils.escapeXml(message.getBody()).replaceAll("\r", "
")).append("</Body>\n");
messageXml.append(attributesXmlFragment);
if (message.getMessageAttributes() != null && message.getMessageAttributes().size() > 0) {
for (String key : message.getMessageAttributes().keySet()) {
if (filterMessageAttributes.contains("All") || filterMessageAttributes.contains("all") || filterMessageAttributes.contains(key)) {
String type = message.getMessageAttributes().get(key).getDataType();
String stringValue = message.getMessageAttributes().get(key).getStringValue();
messageXml.append("\t\t\t<MessageAttribute>\n");
messageXml.append("\t\t\t\t<Name>").append(key).append("</Name>\n");
messageXml.append("\t\t\t\t<Value>\n");
messageXml.append("\t\t\t\t\t<DataType>").append(type).append("</DataType>\n");
if (!type.equals("Binary")) {
messageXml.append("\t\t\t\t\t<StringValue>").append(stringValue).append("</StringValue>\n");
} else {
messageXml.append("\t\t\t\t\t<BinaryValue>").append(stringValue).append("</BinaryValue>\n");
}
messageXml.append("\t\t\t\t</Value>\n");
messageXml.append("\t\t\t</MessageAttribute>\n");
}
}
messageXml.append("\t\t\t<MD5OfMessageAttributes>").append(message.getMD5OfMessageAttributes()).append("</MD5OfMessageAttributes>\n");
}
messageXml.append("\t\t</Message>\n");
return messageXml.toString();
}
private static StringBuffer fillAttributesInReturn(CQSMessage message, List<String> filterAttributes) {
StringBuffer attributesXmlFragment = new StringBuffer("");
if (message.getAttributes() != null) {
for (Map.Entry<String, String> entry : message.getAttributes().entrySet()) {
if (entry.getKey() != null && entry.getKey().length() > 0 && !entry.getKey().equals(CQSConstants.DELAY_SECONDS) && (filterAttributes.isEmpty() || filterAttributes.contains("All") || filterAttributes.contains(entry.getKey()))) {
attributesXmlFragment.append("\t\t\t<Attribute>").append("<Name>").append(entry.getKey()).append("</Name>").append("<Value>").append(entry.getValue()).append("</Value>").append("</Attribute>\n");
}
}
}
return attributesXmlFragment;
}
}