package org.xmlsh.aws; import java.io.IOException; import java.io.PrintStream; import java.util.List; import java.util.Map; import javax.xml.stream.XMLStreamException; import org.xmlsh.aws.util.AWSDDBCommand; import org.xmlsh.aws.util.DDBTypes; import org.xmlsh.core.CoreException; import org.xmlsh.core.InvalidArgumentException; import org.xmlsh.core.Options; import org.xmlsh.core.UnexpectedException; import org.xmlsh.core.UnimplementedException; import org.xmlsh.core.XValue; import org.xmlsh.util.Util; import com.amazonaws.AmazonClientException; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.PutItemOutcome; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.spec.PutItemSpec; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.PutItemRequest; import com.amazonaws.services.dynamodbv2.model.PutItemResult; import com.amazonaws.services.dynamodbv2.model.ReturnValue; import net.sf.saxon.s9api.SaxonApiException; import net.sf.saxon.trans.XPathException; public class ddbPutItem extends AWSDDBCommand { /** * @param args * @throws IOException */ @Override public int run(List<XValue> args) throws Exception { Options opts = getOptions(sTABLE_OPTIONS, sKEY_OPTIONS, sRETURN_OPTIONS, sCONDITION_OPTIONS, sDOCUMENT_OPTS, sATTR_EXPR_OPTIONS); // Options opts = getOptions("expected:+,q=quiet"); parseOptions(opts, args); setSerializeOpts(this.getSerializeOpts(opts)); try { getDDBClient(opts); } catch (UnexpectedException e) { usage(e.getLocalizedMessage()); return 1; } int ret = -1; if(opts.hasOpt("json") || opts.hasOpt("document")) ret = putDocument(opts); else ret = put(opts); return ret; } private int putDocument(Options opts) throws XPathException, IOException, XMLStreamException, SaxonApiException, CoreException { String tableName = opts.getOptStringRequired("table"); DynamoDB dynamoDB = super.getDynamotDB(opts); Table table = dynamoDB.getTable(tableName); PutItemSpec itemSpec = parsePutItemSpec(opts); PrintStream ostream = null; try { PutItemOutcome item = table.putItem(itemSpec); Item r = item.getItem(); if(r != null) { assert (r != null); ostream = mShell.getEnv().getStdout().asPrintStream(getSerializeOpts()); ostream.print(r.toJSON()); ostream.close(); ostream = null; } } catch (AmazonClientException e) { return handleException(e); } finally { if(ostream != null) ostream.close(); } return 0; } private int put(Options opts) throws IOException, XMLStreamException, SaxonApiException, CoreException { String condition = opts.getOptString("condition", null); String returnValues = opts.getOptString("return-values", null); List<XValue> args = opts.getRemainingArgs(); String tableName = opts.getOptStringRequired("table"); Map<String, AttributeValue> item = parseKeyOptions(opts); if(!args.isEmpty()) // allow args to be sequences item.putAll(DDBTypes.parseAttrNameValue(Util.expandSequences(args))); PutItemRequest putItemRequest = new PutItemRequest() .withTableName(tableName).withItem(item) .withExpressionAttributeNames(parseAttrNameExprs(opts)) .withExpressionAttributeValues(parseAttrValueExprs(opts)); if(condition != null) putItemRequest.setConditionExpression(condition); if(returnValues != null) putItemRequest.setReturnValues(returnValues); traceCall("putItem"); PutItemResult result = null; try { result = getAWSClient().putItem(putItemRequest); } catch (AmazonClientException e) { return handleException(e); } startResult(); if(result.getAttributes() != null) { writeItem(result.getAttributes()); } writeMetric(new RequestMetrics(result.getConsumedCapacity(), result.getItemCollectionMetrics())); endResult(); return 0; } protected PutItemSpec parsePutItemSpec(Options opts) throws InvalidArgumentException, UnexpectedException, UnimplementedException, IOException, XPathException { PutItemSpec spec = new PutItemSpec() .withItem(Item.fromMap(DDBTypes.parseItemValueObject(opts))) .withNameMap(parseAttrNameExprs(opts)) .withValueMap(parseAttrValueObjectExprs(opts)); String condition = opts.getOptString("condition", null); String returnValues = opts.getOptString("return-values", null); if(condition != null) spec = spec.withConditionExpression(condition); if(returnValues != null) spec = spec.withReturnValues(ReturnValue.fromValue(returnValues)); if(opts.hasRemainingArgs()) return spec; return spec; } }