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 net.sf.saxon.s9api.SaxonApiException;
import org.xmlsh.aws.util.AWSSQSCommand;
import org.xmlsh.core.CoreException;
import org.xmlsh.core.Options;
import org.xmlsh.core.OutputPort;
import org.xmlsh.core.UnexpectedException;
import org.xmlsh.core.XValue;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;
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);
// Get message from file
if( opts.hasOpt("f")){
out = mShell.getEnv().getOutput(opts.getOptValue("f"),false);
} 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 = mAmazon.receiveMessage(request);
OutputPort stdout = getStdout();
mWriter = stdout.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();
stdout.writeSequenceTerminator(getSerializeOpts());
stdout.release();
return 0;
}
}