Integrate r9381 into GWT 2.1 branch. Disallow persisted entities with null version properties because it breaks RequestFactory update semantics. git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/2.1@9382 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/requestfactory/server/SimpleRequestProcessor.java b/user/src/com/google/gwt/requestfactory/server/SimpleRequestProcessor.java index 465facb..2835056 100644 --- a/user/src/com/google/gwt/requestfactory/server/SimpleRequestProcessor.java +++ b/user/src/com/google/gwt/requestfactory/server/SimpleRequestProcessor.java
@@ -186,7 +186,7 @@ processOperationMessages(state, message); List<Object> decoded = decodeInvocationArguments(state, message.getInvocations().get(0).getParameters(), - new Class<?>[] {proxyType}, new Type[] {domainClass}); + new Class<?>[]{proxyType}, new Type[]{domainClass}); @SuppressWarnings("unchecked") List<T> toReturn = (List<T>) decoded; @@ -273,10 +273,16 @@ Splittable version = null; if (writeOperation == WriteOperation.PERSIST || writeOperation == WriteOperation.UPDATE) { + /* + * If we're sending an operation, the domain object must be persistent. + * This means that it must also have a non-null version. + */ Object domainVersion = service.getVersion(domainObject); - if (domainVersion != null) { - version = returnState.flatten(domainVersion); + if (domainVersion == null) { + throw new UnexpectedException("The persisted entity with id " + + service.getId(domainObject) + " has a null version", null); } + version = returnState.flatten(domainVersion); } boolean inResponse = bean.getTag(Constants.IN_RESPONSE) != null;
diff --git a/user/src/com/google/gwt/requestfactory/shared/impl/AbstractRequestFactory.java b/user/src/com/google/gwt/requestfactory/shared/impl/AbstractRequestFactory.java index b5ffeda..9616776 100644 --- a/user/src/com/google/gwt/requestfactory/shared/impl/AbstractRequestFactory.java +++ b/user/src/com/google/gwt/requestfactory/shared/impl/AbstractRequestFactory.java
@@ -82,7 +82,7 @@ protected RequestData makeRequestData() { return new RequestData( "com.google.gwt.requestfactory.shared.impl.FindRequest::find", - new Object[] {proxyId}, propertyRefs, proxyId.getProxyClass(), null); + new Object[]{proxyId}, propertyRefs, proxyId.getProxyClass(), null); } }; } @@ -142,6 +142,8 @@ */ protected boolean hasVersionChanged(SimpleProxyId<?> id, String observedVersion) { + assert id != null : "id"; + assert observedVersion != null : "observedVersion"; String key = getHistoryToken(id); String existingVersion = version.get(key); // Return true if we haven't seen this before or the versions differ
diff --git a/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java b/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java index 8dec044..1763de6 100644 --- a/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java +++ b/user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java
@@ -1069,6 +1069,27 @@ }); } + /** + * Test that the server code will not allow a persisted entity to be returned + * if it has a null version property. + */ + public void testPersistedEntityWithNullVersion() { + delayTestFinish(DELAY_TEST_FINISH); + simpleFooRequest().getSimpleFooWithNullVersion().fire( + new Receiver<SimpleFooProxy>() { + + @Override + public void onFailure(ServerFailure error) { + finishTestAndReset(); + } + + @Override + public void onSuccess(SimpleFooProxy response) { + fail(); + } + }); + } + public void testPersistExistingEntityExistingRelation() { delayTestFinish(DELAY_TEST_FINISH);
diff --git a/user/test/com/google/gwt/requestfactory/server/SimpleFoo.java b/user/test/com/google/gwt/requestfactory/server/SimpleFoo.java index cd4f8d6..afcd18e 100644 --- a/user/test/com/google/gwt/requestfactory/server/SimpleFoo.java +++ b/user/test/com/google/gwt/requestfactory/server/SimpleFoo.java
@@ -124,6 +124,16 @@ return list; } + /** + * This tests that the server detects and disallows the use of persisted + * objects with a null version property. + */ + public static SimpleFoo getSimpleFooWithNullVersion() { + SimpleFoo foo = new SimpleFoo(); + foo.setVersion(null); + return foo; + } + public static SimpleFoo getSimpleFooWithSubPropertyCollection() { SimpleFoo foo = new SimpleFoo(); SimpleFoo subFoo = new SimpleFoo();
diff --git a/user/test/com/google/gwt/requestfactory/shared/ComplexKeysTest.java b/user/test/com/google/gwt/requestfactory/shared/ComplexKeysTest.java index 60af61d..701a276 100644 --- a/user/test/com/google/gwt/requestfactory/shared/ComplexKeysTest.java +++ b/user/test/com/google/gwt/requestfactory/shared/ComplexKeysTest.java
@@ -67,8 +67,8 @@ return key; } - public Void getVersion() { - return null; + public Integer getVersion() { + return 0; } } @@ -101,8 +101,8 @@ return key; } - public Void getVersion() { - return null; + public Integer getVersion() { + return 0; } } @@ -129,8 +129,8 @@ return key; } - public Void getVersion() { - return null; + public Integer getVersion() { + return 0; } }
diff --git a/user/test/com/google/gwt/requestfactory/shared/SimpleFooRequest.java b/user/test/com/google/gwt/requestfactory/shared/SimpleFooRequest.java index bbb4c6b..a27ad31 100644 --- a/user/test/com/google/gwt/requestfactory/shared/SimpleFooRequest.java +++ b/user/test/com/google/gwt/requestfactory/shared/SimpleFooRequest.java
@@ -49,6 +49,8 @@ Request<Set<Integer>> getNumberSet(); + Request<SimpleFooProxy> getSimpleFooWithNullVersion(); + Request<SimpleFooProxy> getSimpleFooWithSubPropertyCollection(); Request<SimpleFooProxy> getTripletReference();