Git Product home page Git Product logo

alternator's People

Contributors

aluedeke avatar andresilva avatar ehoule avatar flozano avatar itoshkov avatar mboudreau avatar raniz-at-sony avatar relaxkeren avatar rrutt avatar syelis-tomosys avatar thughes avatar tnbred avatar vdenisov avatar vitoace avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

alternator's Issues

NPE is thrown when updating with AttributeValueUpdate without action

v0.6.4

com.amazonaws.AmazonServiceException: Caught java.lang.NullPointerException (null) at com.michelboudreau.alternator.AlternatorDBHandler.updateItem line 991

This does not happen when running the same code against a AWS DynamoDB, I was under the impression one does not have to specify an action:

updateItems.put("NewAttribute",
new AttributeValueUpdate()
.withValue(new AttributeValue().withS("Some Value")));

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelJavaCRUDExample.html

Need to add slf4j dependency in Alternator pom.xml

I added Alternator per the instructions in your readme. However, when I attempt to start the Alternator server, I ran into an exception (see below). It seems to me that you need to specify an additional dependency in your pom.xml?

java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
at org.eclipse.jetty.util.log.JettyAwareLogger.log(JettyAwareLogger.java:613)
at org.eclipse.jetty.util.log.JettyAwareLogger.debug(JettyAwareLogger.java:200)
at org.eclipse.jetty.util.log.Slf4jLog.debug(Slf4jLog.java:84)
at org.eclipse.jetty.util.component.Container.add(Container.java:201)
at org.eclipse.jetty.util.component.Container.update(Container.java:164)
at org.eclipse.jetty.util.component.Container.update(Container.java:106)
at org.eclipse.jetty.server.Server.setConnectors(Server.java:183)
at org.eclipse.jetty.server.Server.addConnector(Server.java:157)
at com.michelboudreau.alternator.AlternatorDB.(AlternatorDB.java:41)
at com.michelboudreau.alternator.AlternatorDB.(AlternatorDB.java:24)
at com.trymph.user.server.persistence.DynamoDBMapperUserTest.setUp(DynamoDBMapperUserTest.java:27)
at junit.framework.TestCase.runBare(TestCase.java:128)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Unable to marshall request to JSON: null

Hi,

First of all, thanks for your library. I think this should have been provided by Amazon since begining.

I've just started to use Alternator today. Previously I've been running my tests with an AWS account. The problem is that when I try to add a new item to a table, I get tle following exception: com.amazonaws.AmazonClientException: Unable to marshall request to JSON: null.

I'm using DynamoDB mapper and have my classes properly annotated

I don't know if this is a problem with my code or bug.

The stack trace is:

15:57:22.207 [main] DEBUG com.amazonaws.request - Sending Request: POST http://localhost:9090/ / Headers: (X-Amz-Target: DynamoDB_20111205.UpdateItem, Content-Length: 726, Content-Type: application/x-amz-json-1.0, )
15:57:25.519 [main] DEBUG o.a.h.i.c.t.ThreadSafeClientConnManager - Get connection: {}->http://localhost:9090, timeout = 50000
15:57:25.519 [main] DEBUG o.a.h.i.conn.tsccm.ConnPoolByRoute - [{}->http://localhost:9090] total kept alive: 1, total issued: 0, total allocated: 1 out of 50
15:57:25.519 [main] DEBUG o.a.h.i.conn.tsccm.ConnPoolByRoute - Getting free connection [{}->http://localhost:9090][null]
15:57:25.519 [main] DEBUG o.a.h.impl.client.DefaultHttpClient - Stale connection check
15:57:25.519 [main] DEBUG o.a.h.c.protocol.RequestAddCookies - CookieSpec selected: best-match
15:57:25.519 [main] DEBUG o.a.h.c.protocol.RequestAuthCache - Auth cache not set in the context
15:57:25.519 [main] DEBUG o.a.h.c.p.RequestTargetAuthentication - Target auth state: UNCHALLENGED
15:57:25.519 [main] DEBUG o.a.h.c.p.RequestProxyAuthentication - Proxy auth state: UNCHALLENGED
15:57:25.519 [main] DEBUG o.a.h.impl.client.DefaultHttpClient - Attempt 1 to execute request
15:57:25.519 [main] DEBUG o.a.h.i.conn.DefaultClientConnection - Sending request: POST / HTTP/1.1
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "POST / HTTP/1.1[\r][\n]"
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "Host: localhost:9090[\r][\n]"
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "X-Amz-Target: DynamoDB_20111205.UpdateItem[\r][\n]"
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "User-Agent: aws-sdk-java/1.3.10 Windows_XP/5.1 Java_HotSpot(TM)_Client_VM/17.1-b03 com.amazonaws.services.dynamodb.datamodeling.DynamoDBMapper/1.3.10[\r][\n]"
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "Content-Type: application/x-amz-json-1.0[\r][\n]"
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "Content-Length: 726[\r][\n]"
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "Connection: Keep-Alive[\r][\n]"
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "[\r][\n]"
15:57:25.519 [main] DEBUG org.apache.http.headers - >> POST / HTTP/1.1
15:57:25.519 [main] DEBUG org.apache.http.headers - >> Host: localhost:9090
15:57:25.519 [main] DEBUG org.apache.http.headers - >> X-Amz-Target: DynamoDB_20111205.UpdateItem
15:57:25.519 [main] DEBUG org.apache.http.headers - >> User-Agent: aws-sdk-java/1.3.10 Windows_XP/5.1 Java_HotSpot(TM)_Client_VM/17.1-b03 com.amazonaws.services.dynamodb.datamodeling.DynamoDBMapper/1.3.10
15:57:25.519 [main] DEBUG org.apache.http.headers - >> Content-Type: application/x-amz-json-1.0
15:57:25.519 [main] DEBUG org.apache.http.headers - >> Content-Length: 726
15:57:25.519 [main] DEBUG org.apache.http.headers - >> Connection: Keep-Alive
15:57:25.519 [main] DEBUG org.apache.http.wire - >> "{"TableName":"accounts-projects","Key":{"HashKeyElement":{"S":"clientIdWithNoDetails"}},"AttributeUpdates":{"grantTypes":{"Value":{"S":"[]"},"Action":"PUT"},"scope":{"Value":{"S":"[]"},"Action":"PUT"},"redirectUris":{"Value":{"S":"[]"},"Action":"PUT"},"refreshTokenValiditySeconds":{"Value":{"N":"0"},"Action":"PUT"},"accessTokenValiditySeconds":{"Value":{"N":"0"},"Action":"PUT"},"resourceIds":{"Value":{"S":"[]"},"Action":"PUT"},"created":{"Value":{"N":"1337781442004"},"Action":"PUT"},"updated":{"Value":{"N":"1337781442004"},"Action":"PUT"},"description":{"Action":"DELETE"},"profileId":{"Action":"DELETE"},"name":{"Action":"DELETE"},"roles":{"Value":{"S":"[]"},"Action":"PUT"},"secret":{"Action":"DELETE"}},"Expected":{}}"
15:57:25.535 [qtp26788115-22] DEBUG org.eclipse.jetty.http.HttpParser - filled 1049/1049
15:57:25.535 [qtp26788115-22 - /] DEBUG org.eclipse.jetty.server.Server - REQUEST / on AsyncHttpConnection@dd874,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=2,l=10,c=726},r=4
15:57:25.535 [qtp26788115-22 - /] DEBUG o.e.j.server.handler.ContextHandler - scope null||/ @ o.e.j.s.ServletContextHandler{/,null}
15:57:25.535 [qtp26788115-22 - /] DEBUG o.e.j.server.handler.ContextHandler - context=||/ @ o.e.j.s.ServletContextHandler{/,null}
15:57:25.535 [qtp26788115-22 - /] DEBUG org.eclipse.jetty.server.session - sessionManager=org.eclipse.jetty.server.session.HashSessionManager@11563a2
15:57:25.535 [qtp26788115-22 - /] DEBUG org.eclipse.jetty.server.session - session=null
15:57:25.535 [qtp26788115-22 - /] DEBUG o.e.jetty.servlet.ServletHandler - servlet |/|null -> org.springframework.web.servlet.DispatcherServlet-14116828
15:57:25.535 [qtp26788115-22 - /] DEBUG o.e.jetty.servlet.ServletHandler - chain=null
15:57:25.535 [qtp26788115-22 - /] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'org.springframework.web.servlet.DispatcherServlet-14116828' processing POST request for [/]
15:57:25.535 [qtp26788115-22 - /] DEBUG o.s.w.s.m.a.DefaultAnnotationHandlerMapping - Mapping [/] to HandlerExecutionChain with handler [com.michelboudreau.alternator.AlternatorDBController@1f489d9] and 1 interceptor
15:57:25.535 [qtp26788115-22 - /] DEBUG o.s.w.b.a.s.HandlerMethodInvoker - Invoking request handler method: public java.lang.String com.michelboudreau.alternator.AlternatorDBController.alternatorDBController(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
15:57:25.566 [qtp26788115-22 - /] DEBUG c.m.a.validation.ValidatorUtils - Invoking validator [com.michelboudreau.alternator.validators.TableNameValidator@45acb5]
15:57:25.566 [qtp26788115-22 - /] DEBUG c.m.a.validation.ValidatorUtils - Invoking validator [com.michelboudreau.alternator.validators.KeyValidator@4dc00a]
15:57:25.566 [qtp26788115-22 - /] DEBUG c.m.a.validation.ValidatorUtils - Invoking validator [com.michelboudreau.alternator.validators.PrimaryKeyValidator@7ae011]
15:57:25.566 [qtp26788115-22 - /] DEBUG o.s.w.s.m.a.AnnotationMethodHandlerExceptionResolver - Resolving exception from handler [com.michelboudreau.alternator.AlternatorDBController@1f489d9]: com.amazonaws.AmazonClientException: Unable to marshall request to JSON: null
15:57:25.566 [qtp26788115-22 - /] DEBUG o.s.w.s.m.a.ResponseStatusExceptionResolver - Resolving exception from handler [com.michelboudreau.alternator.AlternatorDBController@1f489d9]: com.amazonaws.AmazonClientException: Unable to marshall request to JSON: null
15:57:25.566 [qtp26788115-22 - /] DEBUG o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolving exception from handler [com.michelboudreau.alternator.AlternatorDBController@1f489d9]: com.amazonaws.AmazonClientException: Unable to marshall request to JSON: null
15:57:25.598 [qtp26788115-22 - /] DEBUG o.s.web.servlet.DispatcherServlet - Could not complete request
com.amazonaws.AmazonClientException: Unable to marshall request to JSON: null
at com.amazonaws.services.dynamodb.model.transform.UpdateItemResultMarshaller.marshall(UpdateItemResultMarshaller.java:41) ~[classes/:na]
at com.michelboudreau.alternator.AlternatorDBHandler.handle(AlternatorDBHandler.java:54) ~[classes/:na]
at com.michelboudreau.alternator.AlternatorDBController.alternatorDBController(AlternatorDBController.java:32) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_22]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_22]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_22]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_22]
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) ~[spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api-2.5.jar:2.5]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5.jar:2.5]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.Server.handle(Server.java:344) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:894) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:948) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:851) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at java.lang.Thread.run(Thread.java:662) [na:1.6.0_22]
Caused by: java.lang.NullPointerException: null
at com.amazonaws.services.dynamodb.model.transform.UpdateItemResultMarshaller.marshall(UpdateItemResultMarshaller.java:22) ~[classes/:na]
... 36 common frames omitted
15:57:25.598 [qtp26788115-22 - /] DEBUG o.e.jetty.servlet.ServletHandler -
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.amazonaws.AmazonClientException: Unable to marshall request to JSON: null
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-2.5.jar:2.5]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) ~[servlet-api-2.5.jar:2.5]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565) ~[jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.Server.handle(Server.java:344) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:894) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:948) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:851) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at java.lang.Thread.run(Thread.java:662) [na:1.6.0_22]
Caused by: com.amazonaws.AmazonClientException: Unable to marshall request to JSON: null
at com.amazonaws.services.dynamodb.model.transform.UpdateItemResultMarshaller.marshall(UpdateItemResultMarshaller.java:41) ~[classes/:na]
at com.michelboudreau.alternator.AlternatorDBHandler.handle(AlternatorDBHandler.java:54) ~[classes/:na]
at com.michelboudreau.alternator.AlternatorDBController.alternatorDBController(AlternatorDBController.java:32) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_22]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_22]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_22]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_22]
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) ~[spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
... 24 common frames omitted
Caused by: java.lang.NullPointerException: null
at com.amazonaws.services.dynamodb.model.transform.UpdateItemResultMarshaller.marshall(UpdateItemResultMarshaller.java:22) ~[classes/:na]
... 36 common frames omitted
15:57:25.598 [qtp26788115-22 - /] WARN o.e.jetty.servlet.ServletHandler - /
com.amazonaws.AmazonClientException: Unable to marshall request to JSON: null
at com.amazonaws.services.dynamodb.model.transform.UpdateItemResultMarshaller.marshall(UpdateItemResultMarshaller.java:41) ~[classes/:na]
at com.michelboudreau.alternator.AlternatorDBHandler.handle(AlternatorDBHandler.java:54) ~[classes/:na]
at com.michelboudreau.alternator.AlternatorDBController.alternatorDBController(AlternatorDBController.java:32) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_22]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_22]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_22]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_22]
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) ~[spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) ~[spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-2.5.jar:2.5]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) ~[servlet-api-2.5.jar:2.5]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565) ~[jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.Server.handle(Server.java:344) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:894) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:948) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:851) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) [jetty-all-server-7.6.3.v20120416.jar:7.6.3.v20120416]
at java.lang.Thread.run(Thread.java:662) [na:1.6.0_22]
Caused by: java.lang.NullPointerException: null
at com.amazonaws.services.dynamodb.model.transform.UpdateItemResultMarshaller.marshall(UpdateItemResultMarshaller.java:22) ~[classes/:na]
... 36 common frames omitted

Best regards,

Difference with AWS when requesting TableDescription after table deletion

After table deletion you should wait some time in order DynamoDB propagates changes. Amazon provides some examples on how to implement this wait. Basically you keep in a loop asking for table description periodically:

    long startTime = System.currentTimeMillis();
    long endTime = startTime + (10L * 60L * 1000L);
    while (System.currentTimeMillis() < endTime) {
        try {Thread.sleep(1000 * 20);} catch (Exception e) {}
        try {
            DescribeTableRequest request = new DescribeTableRequest().withTableName(tableName);
            TableDescription tableDescription = client.describeTable(request).getTable();
            String tableStatus = tableDescription.getTableStatus();
            logger.debug("  - current state: " + tableStatus);
            if (tableStatus.equals(TableStatus.ACTIVE.toString())) {
                return;
            }
        } catch (AmazonServiceException ase) {
            if (ase.getErrorCode().equalsIgnoreCase("ResourceNotFoundException") == true) {
                logger.debug("Table " + tableName + " is not found. It was deleted.");
                return;
            }
            else {
                throw ase;
            }
        }
    }

When table is deleted, you should get a ResourceNotFoundException, but Alternator does not generate this exception and tableDescription gets null value.

KR,

Exception when instantiating AlternatorDBClientV2

AlternatorDBClientV2 client = new AlternatorDBClientV2();

Executing the line of code abode gives me this exception.

java.lang.IllegalStateException: Unrecognized prefix for the AWS http client class name AlternatorDBClientV2
    at com.amazonaws.AmazonWebServiceClient.computeServiceName(AmazonWebServiceClient.java:546)
    at com.amazonaws.AmazonWebServiceClient.getServiceNameIntern(AmazonWebServiceClient.java:509)
    at com.amazonaws.AmazonWebServiceClient.configSigner(AmazonWebServiceClient.java:202)
    at com.amazonaws.AmazonWebServiceClient.setEndpoint(AmazonWebServiceClient.java:135)
    at com.michelboudreau.alternatorv2.AlternatorDBClientV2.setEndpoint(AlternatorDBClientV2.java:273)
    at com.michelboudreau.alternatorv2.AlternatorDBClientV2.init(AlternatorDBClientV2.java:109)
    at com.michelboudreau.alternatorv2.AlternatorDBClientV2.<init>(AlternatorDBClientV2.java:96)
    at com.michelboudreau.alternatorv2.AlternatorDBClientV2.<init>(AlternatorDBClientV2.java:91)
    at com.salesfront.test.CreateUserTest.setUp(CreateUserTest.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

NoSuchMethodError when starting AlternatorDB

Hi guys,

I've been trying to get your server to run but I'm hitting a failure at startup. I've tried both 3.1.1 and 3.1.2 versions of Spring but no luck.

java.lang.NoSuchMethodError: org.springframework.core.convert.converter.ConverterRegistry.addConverter(Ljava/lang/Class;Ljava/lang/Class;Lorg/springframework/core/convert/converter/Converter;)V
    at org.springframework.core.convert.support.DefaultConversionService.addScalarConverters(DefaultConversionService.java:62)
    at org.springframework.core.convert.support.DefaultConversionService.addDefaultConverters(DefaultConversionService.java:53)
    at org.springframework.core.convert.support.DefaultConversionService.<init>(DefaultConversionService.java:42)
    at org.springframework.core.env.AbstractPropertyResolver.<init>(AbstractPropertyResolver.java:44)
    at org.springframework.core.env.PropertySourcesPropertyResolver.<init>(PropertySourcesPropertyResolver.java:42)
    at org.springframework.core.env.AbstractEnvironment.<init>(AbstractEnvironment.java:101)
    at org.springframework.core.env.StandardEnvironment.<init>(StandardEnvironment.java:54)
    at org.springframework.web.context.support.StandardServletEnvironment.<init>(StandardServletEnvironment.java:43)
    at org.springframework.web.servlet.HttpServletBean.<init>(HttpServletBean.java:90)
    at org.springframework.web.servlet.FrameworkServlet.<init>(FrameworkServlet.java:211)
    at org.springframework.web.servlet.DispatcherServlet.<init>(DispatcherServlet.java:323)
    at com.michelboudreau.alternator.AlternatorDB.<init>(AlternatorDB.java:46)
    at com.michelboudreau.alternator.AlternatorDB.<init>(AlternatorDB.java:20)

Provide mock for AmazonDynamoDBAsyncClient interface

In addition to the synchronous Dynamo interface you may want to provide a mock for the async interface AmazonDynamoDBAsyncClient. A trivial implementation of this could just return "fake future" instances. Thus, it could execute the request right away and return a fake future instance containing the response value. You could even go further and use random sleeps in the future.get method to simulate different network I/O performance.

Delete Item

Cannot currently delete item in version 0.1.2

JSONException when using Set of Strings

Hi,

I'm getting the following error:

com.amazonaws.AmazonClientException: Unable to unmarshall error response (A JSONObject text must begin with '{' at 1 [character 2 line 1])
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:550)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:289)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:170)
at com.michelboudreau.alternator.AlternatorDBClient.invoke(AlternatorDBClient.java:263)
at com.michelboudreau.alternator.AlternatorDBClient.getItem(AlternatorDBClient.java:212)
(โ€ฆ)
Caused by: com.amazonaws.util.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
at com.amazonaws.util.json.JSONTokener.syntaxError(JSONTokener.java:422)
at com.amazonaws.util.json.JSONObject.(JSONObject.java:183)
at com.amazonaws.util.json.JSONObject.(JSONObject.java:310)
at com.amazonaws.http.JsonErrorResponseHandler.handle(JsonErrorResponseHandler.java:42)
at com.amazonaws.http.JsonErrorResponseHandler.handle(JsonErrorResponseHandler.java:29)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:531)
... 20 more

The error happens when I use a set of strings as a value (i.e. withSS()). The same code works perfectly using the original dynamo client.

Alternator needs to use the attributeName for the DynamoDBHashKey

We are defining a DynamoDBTable with a hash key method like this:

@DynamoDBHashKey(attributeName="tokenValue")
public String getTokenValue() {
return tokenValue;
}

When we load an item from this table, it sets the tokenValue field to null which is a bug (Amazon Dynamo DB honors attributeName correctly).

Alternator works fine if we change the attributeName to "id". So, this is a bug in alternator.
Alternator needs to honor attributeName for primary keys.

Upgrade to Jetty 9

Alternator is not working with Jetty 9. This means that you can't use it in projects that uses Dropwizard 0.7 and above.

Create Alternator Maven Plugin, Add to Maven Repo

To make this easy to use on any project, we need to create a plugin that will start the Alternator service before the test starts and stops after they are done. After that's done, it will need to be submitted to a public maven repo.

Query does not return range key attribute value

I have a table with the following attribute definitions {hash:"id", S; range: "timestamp", S}. When I query all elements withAttributeToGet("id", "timestamp"), I'm returned only items with "id" field, but not "timestamp".

LSI Support

Is there a plan to add LSI (Local Secondary Index) support to Alternator ?

Test failures in Alternator

Hi Folks,

Thank you so much for creating this project. I am trying to add it to our Maven repository but I can't because of two test failures.
Here are the stack traces:

All Failed Tests

com.michelboudreau.test.AlternatorItemTest.putItemWithHashKeyOverwriteItem_err 0.12 sec 1
com.michelboudreau.test.AlternatorScanTest.scanWithScanFilterGTTest 5.3 sec 1

Stacktrace for com.michelboudreau.test.AlternatorItemTest.putItemWithHashKeyOverwriteItem_err

java.lang.NullPointerException
at com.michelboudreau.test.AlternatorItemTest.putItemWithHashKeyOverwriteItem_err(AlternatorItemTest.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:474)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:474)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

com.michelboudreau.test.AlternatorScanTest.scanWithScanFilterGTTest

Failing for the past 1 build (Since #1 )
Took 5.3 sec.
add description
Error Message

expected:<180> but was:<0>
Stacktrace

java.lang.AssertionError: expected:<180> but was:<0>
at org.junit.Assert.fail(Assert.java:93)
at org.junit.Assert.failNotEquals(Assert.java:647)
at org.junit.Assert.assertEquals(Assert.java:128)
at org.junit.Assert.assertEquals(Assert.java:472)
at org.junit.Assert.assertEquals(Assert.java:456)
at com.michelboudreau.test.AlternatorScanTest.scanWithScanFilterGTTest(AlternatorScanTest.java:115)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:474)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:474)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

Support for running Alternator as a standalone process

In my forked repository I have a branch that includes an optional Maven profile to build an executable JAR file for running Alternator as a standalone process. This allows access from non-Java client applications under development. For more information see the ReadMe notes on my branch:

https://github.com/rrutt/Alternator/tree/executable-jar#readme

The resulting executable JAR contains all third-party dependencies so it is 15 MB.
This is the reason an optional Maven profile is used to build it.
The normal build omits this larger artifact.

Is this feature something that should be submitted into the main repository?
If not, I am willing to keep it up-to-date as a branch in my forked repository.

BatchGetItem Returns Keys as well as Values

I'm seeing inconsistent results between DynamoDB and AlternatorDB: when doing a BatchGetItems, DynamoDB doesn't return the key as one of the Item AttributeValues, but AlternatorDB does.

Repro steps:
Create table:

dynamoDbClient.createTable(
    new CreateTableRequest().withTableName("test1").withKeySchema(new KeySchema(new KeySchemaElement().withAttributeName("id").withAttributeType("S"))).withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(10L).withWriteCapacityUnits(10L)));

Add rows:

 Map<String, AttributeValue> content = new HashMap<String, AttributeValue>();
content.put("id", new AttributeValue().withS("100"));
content.put("recommendations", new AttributeValue().withSS("orange", "lemon", "common"));
 dynamoDbClient.putItem(new PutItemRequest("test1", content));

content = new HashMap<String, AttributeValue>();
content.put("id", new AttributeValue().withS("100"));
content.put("recommendations", new AttributeValue().withSS("orange", "lemon", "common"));
dynamoDbClient.putItem(new PutItemRequest("test1", content));

Prepare batch request

List<Key> keys = new ArrayList<Key>();
keys.add(new Key().withHashKeyElement(new AttributeValue("100")));
keys.add(new Key().withHashKeyElement(new AttributeValue("101")));

KeysAndAttributes keysAndAttributes = new KeysAndAttributes().withKeys(keys).withAttributesToGet("recommendations");

Map<String, KeysAndAttributes> stuffToGet = new HashMap<String, KeysAndAttributes>();
stuffToGet.put(getTableName(), keysAndAttributes);

BatchGetItemRequest get = new BatchGetItemRequest().withRequestItems(stuffToGet);

Get item, process

BatchGetItemResult result = dynamoClient.batchGetItem(get);
List<String> recommendations = new ArrayList<String>();

        for (BatchResponse response : result.getResponses().values()) {
            for (Map<String, AttributeValue> row : response.getItems()) {
                for (AttributeValue value : row.values()) {
                    recommendations.addAll(value.getSS()); //NPE thrown here as "id" turns up as a value, and correctly returns null for getSS()
                }
            }
        }
        return recommendations;

I've verified this by swapping between implementations (DynamoDB and AlternatorDB).

Loving the project, keep up the good work!

NoSuchMethodError with latest 0.10.0 version (as defined in README.md)

I was attempting to use your library but I must be doing something wrong. I seem to get this when I attempt to construct the AlternatorDBClientV2:

java.lang.NoSuchMethodError: com.michelboudreau.alternatorv2.AlternatorDBClientV2.setConfiguration(Lcom/amazonaws/ClientConfiguration;)V
at com.michelboudreau.alternatorv2.AlternatorDBClientV2.init(AlternatorDBClientV2.java:130)
at com.michelboudreau.alternatorv2.AlternatorDBClientV2.(AlternatorDBClientV2.java:106)
at com.michelboudreau.alternatorv2.AlternatorDBClientV2.(AlternatorDBClientV2.java:101)

Any suggestions?

Possibility to persist data

Hi,

first of all thx for the great work. We are using Alternator as Development and Testing DB for testobject.com.

We would like to have optional persistent storage. Which means saving the db content during shutdown and reloading during boot. This helps a lot to prevent stupid work (like creating new users each an every time).

If this feature isn't planned for the near future we might contribute such feature if you are interested.

Best Regards

Andreas

BatchGetItems - UnprocessedKeys is Null

Just noticed that when doing a BatchGetItems, UnprocessedKeys returns from AlternatorDB as null, whereas in DynamoDB it's not null, even if it has a size of zero.

Delete Table

Current version 0.1.2 cannot delete table. Need it implemented.

TODO list

Hey guys,

Here's a few features that I haven't implemented yet :

-Comparisons operators for scan and queries ( I only did the LT,LE,GT,GE and BETWEEN)
-Delete Table
-Reset Tables
-Delete Item
-list table
-update item
-batch get item
-update item
-update table

Altnerator dependency should be scoped to tests

In your readme, I think you should recommend that alternator dependency is limited to test scope since you don't want it to be bundled in the main jar.

<dependency>
  <groupId>com.michelboudreau</groupId>
  <artifactId>alternator</artifactId>
  <version>0.2.6-SNAPSHOT</version>
  <scope>test</scope>
</dependency>

Alternator allows arbitrary provisioning changes

DynamoDB only allows to (1) decrease provisioning throughput to 10% minimum once a day and/or (2) increase the provisioned throughput up to 100% in one step. Alternator is inconsistent with the AWS SDK implementation of Dynamo since it just updates the provisioning throughput to whatever the user suggests without checking those constraints.

Additional support for newer AWS SDK version (Java API 1.4.*, Node.js AWS-SDK 1.0.*)

Amazon created a new specification for the DynamoDB API that is NOT backward compatible with the earlier version. The earlier version of the API is still supported but is deprecated.

I have a branch in my forked repository where the Alternator emulator allows both versions of the DynamoDB API.

https://github.com/rrutt/Alternator/tree/dual-api-versions

Note however that only the features that were already available thru the original API version are supported.
When processing against the newer API protocol, Alternator simply maps the request objects to the original format and calls the pre-existing logic. It then maps the result to the new API protocol format. Any exceptions are also remapped from the dynamodb namespace to the dynamodbv2 namespace.

I will submit this branch as a new Pull Request to the original repository after I work with it for a few days against our application.

In the meantime the branch above is available for others to evaluate this enhancement.

Synchronization locking needed to support thread-safety on Inserts

When using Alternator for development I was pre-loading some test data via Node.js which is able to spawn several simultaneous worker threads calling the .putItem method.

These test records had several different Range Key values within each Hash Key value. A race condition caused more than one itemRangeGroup collection to be associated with a given Hash Key. Only the first collection remained "visible" to future queries against that Hash Key. The records within the other collection became orphaned and were no longer reachable.

A strategically placed synchronization lock should resolve this.

In the meantime, application developers should consider serializing .putItem method calls during data load operations.

Attributes comparison in AlternatorDBHandler doesn't work

AlternatorDBHandler.java:424

(value.getValue().getN() != null && !item.get(key).equals(value.getValue().getN())) || (value.getValue().getS() != null && !item.get(key).equals(value.getValue().getS())) || (value.getValue().getNS() != null && !item.get(key).equals(value.getValue().getNS())) || (value.getValue().getSS() != null && !item.get(key).equals(value.getValue().getSS()))

There seems to be a wrong pattern here, because item.get(key) produces an AttributeValue which is then compared to an unwrapped value (e.g. String), so equals() always fails.

Licence

Hi,

I would love to use Alternator in a project I'm working on. There is one problem though. I see you have specified the licence as GPL v3 in the pom.xml file. As far as I can see this is the only place you specify the licence. I can not use GPL V3 licensed software Is there any chance to maybe change this to GPL 2.0 or Apache

Implement Comparison Operators

In current version 0.1.2, only these following operators have been implemented: LT,LE,GT,GE and BETWEEN

The rest needs to be added.

Release non SNAPSHOT version

would it be possible to release a non SNAPSHOT versions into the Sonatype maven repository? SNAPSHOT repositories are hard to handle if you want to release your own product with maven.

.NET sample makes service calls

The .NET sample in the README can be improved. Currently it's creating and using RefreshingSessionAWSCredentials, which requires a service call. This isn't necessary and takes away from the whole mock approach. The access and secret keys can simply be passed to the AmazonDynamoDBClient constructor.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.