Skip to content

Commit b87bfa7

Browse files
committed
Fixed ERRAI-794: @MapsTo parameter order no longer affects back reference resolution
1 parent 1e2d852 commit b87bfa7

File tree

16 files changed

+603
-30
lines changed

16 files changed

+603
-30
lines changed

errai-bus/src/test/java/org/jboss/errai/bus/client/tests/BusCommunicationTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ public String getModuleName() {
6060
}
6161

6262
@Override
63-
@SuppressWarnings("rawtypes")
6463
protected void gwtSetUp() throws Exception {
6564
originalHandler = GWT.getUncaughtExceptionHandler();
6665
testHandler = new TestUncaughtExceptionHandler(originalHandler);

errai-bus/src/test/java/org/jboss/errai/bus/client/tests/SerializationTests.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@
7979
import org.jboss.errai.bus.client.tests.support.Koron;
8080
import org.jboss.errai.bus.client.tests.support.NeverDeclareAnArrayOfThisType;
8181
import org.jboss.errai.bus.client.tests.support.OneDimensionalPrimitiveArrayPortable;
82+
import org.jboss.errai.bus.client.tests.support.Outer;
83+
import org.jboss.errai.bus.client.tests.support.Outer2;
8284
import org.jboss.errai.bus.client.tests.support.Person;
8385
import org.jboss.errai.bus.client.tests.support.Student;
8486
import org.jboss.errai.bus.client.tests.support.StudyTreeNodeContainer;
@@ -2278,4 +2280,44 @@ public void callback(EntityWithFactoryMethodAndMixedMappingTypes response) {
22782280
public void testInheritedBuiltInMappings() {
22792281
assertNotNull(Marshalling.getMarshaller(EmptyStackException.class));
22802282
}
2283+
2284+
// This is a regression test for ERRAI-794
2285+
public void testBackReferenceOrderingWithMapsTo() {
2286+
runAfterInit(new Runnable() {
2287+
@Override
2288+
public void run() {
2289+
2290+
final Outer.Nested key = new Outer.Nested("exp");
2291+
final Outer outer = new Outer (Arrays.asList(key), key);
2292+
2293+
MessageBuilder.createCall(new RemoteCallback<Outer>() {
2294+
@Override
2295+
public void callback(Outer response) {
2296+
assertEquals(outer, response);
2297+
finishTest();
2298+
}
2299+
}, TestSerializationRPCService.class).testBackReferenceOrderingWithMapsTo(outer);
2300+
}
2301+
});
2302+
}
2303+
2304+
// This is a regression test for ERRAI-794
2305+
public void testBackReferenceOrderingWithMapsToInverted() {
2306+
runAfterInit(new Runnable() {
2307+
@Override
2308+
public void run() {
2309+
2310+
final Outer2.Nested key = new Outer2.Nested("exp");
2311+
final Outer2 outer = new Outer2(key, Arrays.asList(key));
2312+
2313+
MessageBuilder.createCall(new RemoteCallback<Outer2>() {
2314+
@Override
2315+
public void callback(Outer2 response) {
2316+
assertEquals(outer, response);
2317+
finishTest();
2318+
}
2319+
}, TestSerializationRPCService.class).testBackReferenceOrderingWithMapsToInverted(outer);
2320+
}
2321+
});
2322+
}
22812323
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package org.jboss.errai.bus.client.tests.support;
2+
3+
import java.util.List;
4+
5+
import org.jboss.errai.common.client.api.annotations.MapsTo;
6+
import org.jboss.errai.common.client.api.annotations.Portable;
7+
8+
@Portable
9+
public class Outer {
10+
private final Nested key;
11+
private final List<Nested> keys;
12+
13+
public Outer(@MapsTo("keys") List<Nested> _keys, @MapsTo("key") Nested _key) {
14+
this.key = _key;
15+
this.keys = _keys;
16+
}
17+
18+
@Portable
19+
public static class Nested {
20+
private final String value;
21+
22+
public Nested(@MapsTo("value") String value) {
23+
this.value = value;
24+
}
25+
26+
@Override
27+
public String toString() {
28+
return "Nested [value=" + value + "]";
29+
}
30+
31+
@Override
32+
public int hashCode() {
33+
final int prime = 31;
34+
int result = 1;
35+
result = prime * result + ((value == null) ? 0 : value.hashCode());
36+
return result;
37+
}
38+
39+
@Override
40+
public boolean equals(Object obj) {
41+
if (this == obj)
42+
return true;
43+
if (obj == null)
44+
return false;
45+
if (getClass() != obj.getClass())
46+
return false;
47+
Nested other = (Nested) obj;
48+
if (value == null) {
49+
if (other.value != null)
50+
return false;
51+
}
52+
else if (!value.equals(other.value))
53+
return false;
54+
return true;
55+
}
56+
}
57+
58+
@Override
59+
public String toString() {
60+
return "Outer [key=" + key + ", keys=" + keys + "]";
61+
}
62+
63+
@Override
64+
public int hashCode() {
65+
final int prime = 31;
66+
int result = 1;
67+
result = prime * result + ((key == null) ? 0 : key.hashCode());
68+
result = prime * result + ((keys == null) ? 0 : keys.hashCode());
69+
return result;
70+
}
71+
72+
@Override
73+
public boolean equals(Object obj) {
74+
if (this == obj)
75+
return true;
76+
if (obj == null)
77+
return false;
78+
if (getClass() != obj.getClass())
79+
return false;
80+
Outer other = (Outer) obj;
81+
if (key == null) {
82+
if (other.key != null)
83+
return false;
84+
}
85+
else if (!key.equals(other.key))
86+
return false;
87+
if (keys == null) {
88+
if (other.keys != null)
89+
return false;
90+
}
91+
else if (!keys.equals(other.keys))
92+
return false;
93+
return true;
94+
}
95+
96+
97+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package org.jboss.errai.bus.client.tests.support;
2+
3+
import java.util.List;
4+
5+
import org.jboss.errai.common.client.api.annotations.MapsTo;
6+
import org.jboss.errai.common.client.api.annotations.Portable;
7+
8+
@Portable
9+
public class Outer2 {
10+
private final Nested key;
11+
private final List<Nested> keys;
12+
13+
public Outer2(@MapsTo("key") Nested key, @MapsTo("keys") List<Nested> keys) {
14+
this.key = key;
15+
this.keys = keys;
16+
}
17+
18+
@Portable
19+
public static class Nested {
20+
private final String value;
21+
22+
public Nested(@MapsTo("value") String value) {
23+
this.value = value;
24+
}
25+
26+
@Override
27+
public String toString() {
28+
return "Nested [value=" + value + "]";
29+
}
30+
31+
@Override
32+
public int hashCode() {
33+
final int prime = 31;
34+
int result = 1;
35+
result = prime * result + ((value == null) ? 0 : value.hashCode());
36+
return result;
37+
}
38+
39+
@Override
40+
public boolean equals(Object obj) {
41+
if (this == obj)
42+
return true;
43+
if (obj == null)
44+
return false;
45+
if (getClass() != obj.getClass())
46+
return false;
47+
Nested other = (Nested) obj;
48+
if (value == null) {
49+
if (other.value != null)
50+
return false;
51+
}
52+
else if (!value.equals(other.value))
53+
return false;
54+
return true;
55+
}
56+
}
57+
58+
@Override
59+
public String toString() {
60+
return "Outer [key=" + key + ", keys=" + keys + "]";
61+
}
62+
63+
@Override
64+
public int hashCode() {
65+
final int prime = 31;
66+
int result = 1;
67+
result = prime * result + ((key == null) ? 0 : key.hashCode());
68+
result = prime * result + ((keys == null) ? 0 : keys.hashCode());
69+
return result;
70+
}
71+
72+
@Override
73+
public boolean equals(Object obj) {
74+
if (this == obj)
75+
return true;
76+
if (obj == null)
77+
return false;
78+
if (getClass() != obj.getClass())
79+
return false;
80+
Outer2 other = (Outer2) obj;
81+
if (key == null) {
82+
if (other.key != null)
83+
return false;
84+
}
85+
else if (!key.equals(other.key))
86+
return false;
87+
if (keys == null) {
88+
if (other.keys != null)
89+
return false;
90+
}
91+
else if (!keys.equals(other.keys))
92+
return false;
93+
return true;
94+
}
95+
96+
97+
}

errai-bus/src/test/java/org/jboss/errai/bus/client/tests/support/TestSerializationRPCService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,8 @@ public EntityWithConstructorAndMethodMappedLong testConstructorAndMethodMappedLo
212212
public EntityWithMixedMappingTypes testEntityWithMixedMappingTypes(EntityWithMixedMappingTypes entity);
213213

214214
public EntityWithFactoryMethodAndMixedMappingTypes testEntityWithFactoryMethodAndMixedMappingTypes(EntityWithFactoryMethodAndMixedMappingTypes entity);
215+
216+
public Outer testBackReferenceOrderingWithMapsTo(Outer entity);
217+
218+
public Outer2 testBackReferenceOrderingWithMapsToInverted(Outer2 entity);
215219
}

errai-bus/src/test/java/org/jboss/errai/bus/server/TestSerializationRPCServiceImpl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
import org.jboss.errai.bus.client.tests.support.ImplicitEnum;
6262
import org.jboss.errai.bus.client.tests.support.Koron;
6363
import org.jboss.errai.bus.client.tests.support.NeverDeclareAnArrayOfThisType;
64+
import org.jboss.errai.bus.client.tests.support.Outer;
65+
import org.jboss.errai.bus.client.tests.support.Outer2;
6466
import org.jboss.errai.bus.client.tests.support.SubMoron;
6567
import org.jboss.errai.bus.client.tests.support.TestEnumA;
6668
import org.jboss.errai.bus.client.tests.support.TestSerializationRPCService;
@@ -493,4 +495,14 @@ public EntityWithMixedMappingTypes testEntityWithMixedMappingTypes(EntityWithMix
493495
public EntityWithFactoryMethodAndMixedMappingTypes testEntityWithFactoryMethodAndMixedMappingTypes(EntityWithFactoryMethodAndMixedMappingTypes entity) {
494496
return entity;
495497
}
498+
499+
@Override
500+
public Outer testBackReferenceOrderingWithMapsTo(Outer entity) {
501+
return entity;
502+
}
503+
504+
@Override
505+
public Outer2 testBackReferenceOrderingWithMapsToInverted(Outer2 entity) {
506+
return entity;
507+
}
496508
}

errai-marshalling/src/main/java/org/jboss/errai/marshalling/rebind/api/impl/defaultjava/DefaultJavaMappingStrategy.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,15 @@ public ClassStructureBuilder<?> getMarshaller(String marshallerClassName) {
166166
final Mapping[] cMappings = instantiationMapping.getMappings();
167167
if (cMappings.length > 0) {
168168
// use constructor mapping.
169+
final List<String> memberKeys = new ArrayList<String>();
170+
for (MemberMapping memberMapping : mappingDefinition.getMemberMappings()) {
171+
memberKeys.add(memberMapping.getKey());
172+
}
173+
174+
final Statement[] constructorParameters = new Statement[cMappings.length];
169175

170-
final List<Statement> constructorParameters = new ArrayList<Statement>();
171-
172-
for (final Mapping mapping : mappingDefinition.getInstantiationMapping().getMappings()) {
176+
for (final Mapping mapping : instantiationMapping.getMappingsInKeyOrder(memberKeys)) {
177+
int parmIndex = instantiationMapping.getIndex(mapping.getKey());
173178
final MetaClass type = mapping.getType().asBoxed();
174179
BlockBuilder<?> lazyInitMethod = (needsLazyInit(type)) ? initMethod : null;
175180
if (type.isArray()) {
@@ -187,14 +192,14 @@ public ClassStructureBuilder<?> getMarshaller(String marshallerClassName) {
187192
Statement deferred = context.getArrayMarshallerCallback().deferred(type, arrayMarshaller);
188193
MarshallingGenUtil.ensureMarshallerFieldCreated(classStructureBuilder, toMap, type, lazyInitMethod,
189194
deferred);
190-
constructorParameters.add(
195+
constructorParameters[parmIndex] =
191196
Stmt.loadVariable(MarshallingGenUtil.getVarName(type)).invoke("demarshall",
192-
extractJSONObjectProperty(mapping.getKey(), EJObject.class), Stmt.loadVariable("a1")));
197+
extractJSONObjectProperty(mapping.getKey(), EJObject.class), Stmt.loadVariable("a1"));
193198
}
194199
else {
195200
MarshallingGenUtil.ensureMarshallerFieldCreated(classStructureBuilder, toMap, type, lazyInitMethod);
196-
constructorParameters.add(context.getArrayMarshallerCallback()
197-
.demarshall(type, extractJSONObjectProperty(mapping.getKey(), EJObject.class)));
201+
constructorParameters[parmIndex] = context.getArrayMarshallerCallback()
202+
.demarshall(type, extractJSONObjectProperty(mapping.getKey(), EJObject.class));
198203
}
199204
}
200205
else {
@@ -206,11 +211,10 @@ public ClassStructureBuilder<?> getMarshaller(String marshallerClassName) {
206211
MarshallingGenUtil.ensureMarshallerFieldCreated(classStructureBuilder, toMap, type, lazyInitMethod);
207212
if (context.canMarshal(type.getFullyQualifiedName())) {
208213
Statement s = maybeAddAssumedTypes(builder,
209-
"c" + constructorParameters.size(),
210-
// null,
214+
"c" + parmIndex,
211215
mapping, fieldDemarshall(mapping, EJObject.class));
212216

213-
constructorParameters.add(s);
217+
constructorParameters[parmIndex] = s;
214218
}
215219
else {
216220
throw new MarshallingException("Encountered non-marshallable type " + type +
@@ -227,8 +231,7 @@ public ClassStructureBuilder<?> getMarshaller(String marshallerClassName) {
227231
builder
228232
.append(Stmt.declareVariable(toMap).named("entity")
229233
.initializeWith(
230-
Stmt.newObject(toMap, constructorParameters
231-
.toArray(new Object[constructorParameters.size()]))));
234+
Stmt.newObject(toMap, (Object[]) constructorParameters)));
232235
}
233236
else {
234237
PrivateAccessUtil.addPrivateAccessStubs(gwtTarget ? "jsni" : "reflection", classStructureBuilder,
@@ -238,14 +241,14 @@ public ClassStructureBuilder<?> getMarshaller(String marshallerClassName) {
238241
Stmt.invokeStatic(
239242
classStructureBuilder.getClassDefinition(),
240243
PrivateAccessUtil.getPrivateMethodName(constructor),
241-
constructorParameters.toArray(new Object[constructorParameters.size()]))));
244+
(Object[]) constructorParameters)));
242245
}
243246
}
244247
else if (instantiationMapping instanceof FactoryMapping) {
245248
builder.append(Stmt.declareVariable(toMap).named("entity")
246249
.initializeWith(
247250
Stmt.invokeStatic(toMap, ((FactoryMapping) instantiationMapping).getMember().getName(),
248-
constructorParameters.toArray(new Object[constructorParameters.size()]))));
251+
(Object[]) constructorParameters)));
249252
}
250253
}
251254
else {

errai-marshalling/src/main/java/org/jboss/errai/marshalling/rebind/api/model/ConstructorMapping.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,5 @@
2323
*/
2424
public interface ConstructorMapping extends InstantiationMapping {
2525
public MetaConstructor getMember();
26-
2726
public boolean isNoConstruct();
2827
}

errai-marshalling/src/main/java/org/jboss/errai/marshalling/rebind/api/model/InstantiationMapping.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.jboss.errai.marshalling.rebind.api.model;
1818

19+
import java.util.List;
20+
1921
import org.jboss.errai.codegen.meta.MetaClass;
2022
import org.jboss.errai.codegen.meta.MetaClassMember;
2123

@@ -24,6 +26,9 @@
2426
*/
2527
public interface InstantiationMapping {
2628
public Mapping[] getMappings();
29+
public Mapping[] getMappingsInKeyOrder(List<String> keys);
30+
public int getIndex(String key);
31+
2732
public Class<?>[] getSignature();
2833

2934
public MetaClassMember getMember();

0 commit comments

Comments
 (0)