/* * Copyright 2008-2012 Amazon Technologies, Inc. * * 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://aws.amazon.com/apache2.0 * * This file 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.amazonaws.eclipse.datatools.enablement.simpledb.internal.driver; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.jmock.integration.junit3.MockObjectTestCase; import com.amazonaws.eclipse.datatools.enablement.simpledb.driver.SimpleDBItemName; import com.amazonaws.services.simpledb.model.Attribute; import com.amazonaws.services.simpledb.model.DeleteAttributesRequest; import com.amazonaws.services.simpledb.model.PutAttributesRequest; public class JdbcStatementTest extends MockObjectTestCase { @Override protected void setUp() throws Exception { super.setUp(); } public void testSimpleUpdate() throws Exception { String[] params = new String[] { "222", "myitem" }; String[][] attrs = new String[][] { new String[] { "111", "222" } }; assertUpdate("update mydomain set `111`=? where `" + SimpleDBItemName.ITEM_HEADER + "`=?", params, "mydomain", "myitem", attrs); } public void testComplexUpdate() throws Exception { String[] params = new String[] { "1111", "2222", "3333", "myitem" }; String[][] attrs = new String[][] { new String[] { "111", "1111" }, new String[] { "222", "2222" }, new String[] { "333", "3333" } }; assertUpdate("update mydomain set `111`=?, `222`=?, `333`=? where `" + SimpleDBItemName.ITEM_HEADER + "`=?", params, "mydomain", "myitem", attrs); } public void testNonPreparedUpdate() throws Exception { try { String[][] attrs = new String[][] { new String[] { "111", "1111" }, new String[] { "222", "2222" } }; assertUpdate("update mydomain set `111`='1111', `222`='2222' where `" + SimpleDBItemName.ITEM_HEADER + "`='myitem'", null, "mydomain", "myitem", attrs); fail(); } catch (SQLException e) { // ok, simple statements not supported yet } } public void testDeletingAttributes() throws Exception { String[] params = new String[] { "1111", null, "myitem" }; String[][] attrs = new String[][] { new String[] { "111", "1111" } }; List<Object> reqs = assertUpdate("update mydomain set `111`=?, `222`=? where `" + SimpleDBItemName.ITEM_HEADER + "`=?", params, "mydomain", "myitem", attrs); assertEquals(2, reqs.size()); Object req1 = reqs.get(1); assertTrue(req1 instanceof DeleteAttributesRequest); assertEquals(1, ((DeleteAttributesRequest) req1).getAttributes().size()); assertEquals("222", ((DeleteAttributesRequest) req1).getAttributes().get(0).getName()); } public void testSimpleInsert() throws Exception { String[] params = new String[] { "myitem", "222" }; String[][] attrs = new String[][] { new String[] { "111", "222" } }; assertUpdate("insert into `mydomain` (`" + SimpleDBItemName.ITEM_HEADER + "`, `111`) values(?, ?)", params, "mydomain", "myitem", attrs); } public void testDeleteRow() throws Exception { String[] params = new String[] { "myitem" }; List<Object> reqs = assertUpdate("delete from `mydomain` where `" + SimpleDBItemName.ITEM_HEADER + "`=?", params, "mydomain", "myitem", null); assertEquals(1, reqs.size()); Object req = reqs.get(0); assertTrue(req instanceof DeleteAttributesRequest); List<Attribute> attribute = ((DeleteAttributesRequest) req).getAttributes(); assertTrue(attribute == null || attribute.isEmpty()); } private List<Object> assertUpdate(final String sql, final String[] params, final String domain, final String item, final String[][] setAttrs) throws SQLException { final List<Object> reqHolder = new ArrayList<Object>(); JdbcStatement stmt; if (params != null) { stmt = new JdbcPreparedStatement(null, sql) { @Override int executeSDBRequest(final Object req) throws SQLException { if (req instanceof Collection) { return super.executeSDBRequest(req); } reqHolder.add(req); return 0; } }; int tally = 1; for (String param : params) { ((JdbcPreparedStatement) stmt).setObject(tally++, param); } } else { stmt = new JdbcStatement(null) { @Override int executeSDBRequest(final Object req) throws SQLException { if (req instanceof Collection) { return super.executeSDBRequest(req); } reqHolder.add(req); return 0; } }; } stmt.executeUpdate(sql); for (Object req : reqHolder) { if (req instanceof PutAttributesRequest) { PutAttributesRequest pareq = (PutAttributesRequest) req; assertEquals(domain, pareq.getDomainName().toLowerCase()); assertEquals(item, pareq.getItemName()); assertEquals(setAttrs.length, pareq.getAttributes().size()); int tally = 0; for (String[] attr : setAttrs) { assertEquals(attr[0], pareq.getAttributes().get(tally).getName()); assertEquals(attr[1], pareq.getAttributes().get(tally).getValue()); ++tally; } } } return reqHolder; } }