package org.xmlsh.aws; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import javax.xml.stream.XMLStreamException; import org.xmlsh.aws.util.AWSSQSCommand; import org.xmlsh.core.CoreException; import org.xmlsh.core.Options; import org.xmlsh.core.UnexpectedException; import org.xmlsh.core.XValue; import org.xmlsh.core.io.OutputPort; import com.amazonaws.services.sqs.model.Message; import com.amazonaws.services.sqs.model.ReceiveMessageRequest; import com.amazonaws.services.sqs.model.ReceiveMessageResult; import net.sf.saxon.s9api.SaxonApiException; public class sqsReceiveMessages extends AWSSQSCommand { /** * @param args * @throws IOException */ @Override public int run(List<XValue> args) throws Exception { Options opts = getOptions("f=file:,m=max:,t=timeout:,w=wait:"); parseOptions(opts, args); setSerializeOpts(this.getSerializeOpts(opts)); args = opts.getRemainingArgs(); if(args.size() < 1) { usage(); return 1; } String url = args.get(0).toString(); OutputPort out; int max = opts.getOptInt("m", 1); int visibilityTimeout = opts.getOptInt("timeout", 0); int wait = opts.getOptInt("wait", 0); // write to port if(opts.hasOpt("p")) { out = mShell.getEnv().getOutputPort(opts.getOptStringRequired("p")); } else // Put message to file if(opts.hasOpt("f")) { out = mShell.getEnv().getOutput(opts.getOptValue("f"), true); } else if(args.size() == 1) out = getStdout(); else { usage(); return 1; } try { getSQSClient(opts); } catch (UnexpectedException e) { usage(e.getLocalizedMessage()); return 1; } int ret; ret = receive(url, max, visibilityTimeout, wait, out); return ret; } private int receive(String url, int max, int visibilityTimeout, int wait, OutputPort out) throws IOException, XMLStreamException, SaxonApiException, CoreException { List<String> attributeNames = new ArrayList<String>(1); attributeNames.add("All"); ReceiveMessageRequest request = new ReceiveMessageRequest(); request.setQueueUrl(url); request.setAttributeNames(attributeNames); request.setMaxNumberOfMessages(max); request.setWaitTimeSeconds(wait); if(visibilityTimeout != 0) request.setVisibilityTimeout(visibilityTimeout); traceCall("receiveMessage"); ReceiveMessageResult result = getAWSClient().receiveMessage(request); mWriter = out.asXMLStreamWriter(getSerializeOpts()); startDocument(); startElement(getName()); for(Message m : result.getMessages()) { startElement("message"); attribute("md5", m.getMD5OfBody()); attribute("id", m.getMessageId()); attribute("receipt", m.getReceiptHandle()); startElement("attributes"); for(Entry<String, String> attr : m.getAttributes().entrySet()) { startElement("attribute"); attribute("name", attr.getKey()); attribute("value", attr.getValue()); endElement(); } endElement(); startElement("body"); mWriter.writeCharacters(m.getBody()); endElement(); endElement(); } endElement(); endDocument(); closeWriter(); out.writeSequenceTerminator(getSerializeOpts()); return 0; } }