Skip to content

Commit a9277eb

Browse files
authored
Fix inconsistent Mediator output (#7617)
1 parent e9a855f commit a9277eb

File tree

3 files changed

+58
-53
lines changed

3 files changed

+58
-53
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* None.
55

66
### Fixed
7-
* None.
7+
* Output from the annotation processor was not deterministic, which could result in cache misses. (Issue [#7615](https://github.com/realm/realm-java/issues/7615))
88

99
### Compatibility
1010
* File format: Generates Realms with format v22. Unsynced Realms will be upgraded from Realm Java 2.0 and later. Synced Realms can only be read and upgraded if created with Realm Java v10.0.0-BETA.1.
@@ -14,6 +14,9 @@
1414
### Internal
1515
* None.
1616

17+
### Credits
18+
* Thanks to @jprinet for making the annotation processor output deterministic.
19+
1720

1821
## 10.9.0 (2021-12-06)
1922

realm/realm-annotations-processor/src/main/java/io/realm/processor/RealmProxyMediatorGenerator.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ class RealmProxyMediatorGenerator(private val processingEnvironment: ProcessingE
3737
private val primaryKeyClasses = mutableListOf<QualifiedClassName>()
3838

3939
init {
40-
for (metadata in classesToValidate) {
40+
// Sort classes to ensure deterministic output. This is relevant when e.g. using Gradle
41+
// Remote Cache since the order is not guaranteed between OS and Java versions.
42+
for (metadata in classesToValidate.toSortedSet(compareByDescending { it.qualifiedClassName.name })) {
4143
qualifiedModelClasses.add(metadata.qualifiedClassName)
4244
val qualifiedProxyClassName = QualifiedClassName("${Constants.REALM_PACKAGE_NAME}.${Utils.getProxyClassName(metadata.qualifiedClassName)}")
4345
qualifiedProxyClasses.add(qualifiedProxyClassName)

realm/realm-annotations-processor/src/test/resources/io/realm/DefaultRealmModuleMediator.java

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -27,55 +27,55 @@ class DefaultRealmModuleMediator extends RealmProxyMediator {
2727
private static final Set<Class<? extends RealmModel>> MODEL_CLASSES;
2828
static {
2929
Set<Class<? extends RealmModel>> modelClasses = new HashSet<Class<? extends RealmModel>>(2);
30-
modelClasses.add(some.test.AllTypes.class);
3130
modelClasses.add(some.test.Simple.class);
31+
modelClasses.add(some.test.AllTypes.class);
3232
MODEL_CLASSES = Collections.unmodifiableSet(modelClasses);
3333
}
3434

3535
@Override
3636
public Map<Class<? extends RealmModel>, OsObjectSchemaInfo> getExpectedObjectSchemaInfoMap() {
3737
Map<Class<? extends RealmModel>, OsObjectSchemaInfo> infoMap = new HashMap<Class<? extends RealmModel>, OsObjectSchemaInfo>(2);
38-
infoMap.put(some.test.AllTypes.class, io.realm.some_test_AllTypesRealmProxy.getExpectedObjectSchemaInfo());
3938
infoMap.put(some.test.Simple.class, io.realm.some_test_SimpleRealmProxy.getExpectedObjectSchemaInfo());
39+
infoMap.put(some.test.AllTypes.class, io.realm.some_test_AllTypesRealmProxy.getExpectedObjectSchemaInfo());
4040
return infoMap;
4141
}
4242

4343
@Override
4444
public ColumnInfo createColumnInfo(Class<? extends RealmModel> clazz, OsSchemaInfo schemaInfo) {
4545
checkClass(clazz);
4646

47-
if (clazz.equals(some.test.AllTypes.class)) {
48-
return io.realm.some_test_AllTypesRealmProxy.createColumnInfo(schemaInfo);
49-
}
5047
if (clazz.equals(some.test.Simple.class)) {
5148
return io.realm.some_test_SimpleRealmProxy.createColumnInfo(schemaInfo);
5249
}
50+
if (clazz.equals(some.test.AllTypes.class)) {
51+
return io.realm.some_test_AllTypesRealmProxy.createColumnInfo(schemaInfo);
52+
}
5353
throw getMissingProxyClassException(clazz);
5454
}
5555

5656
@Override
5757
public String getSimpleClassNameImpl(Class<? extends RealmModel> clazz) {
5858
checkClass(clazz);
5959

60-
if (clazz.equals(some.test.AllTypes.class)) {
61-
return "AllTypes";
62-
}
6360
if (clazz.equals(some.test.Simple.class)) {
6461
return "Simple";
6562
}
63+
if (clazz.equals(some.test.AllTypes.class)) {
64+
return "AllTypes";
65+
}
6666
throw getMissingProxyClassException(clazz);
6767
}
6868

6969
@Override
7070
public Class<? extends RealmModel> getClazzImpl(String className) {
7171
checkClassName(className);
7272

73-
if (className.equals("AllTypes")) {
74-
return some.test.AllTypes.class;
75-
}
7673
if (className.equals("Simple")) {
7774
return some.test.Simple.class;
7875
}
76+
if (className.equals("AllTypes")) {
77+
return some.test.AllTypes.class;
78+
}
7979
throw getMissingProxyClassException(className);
8080
}
8181

@@ -91,12 +91,12 @@ public <E extends RealmModel> E newInstance(Class<E> clazz, Object baseRealm, Ro
9191
objectContext.set((BaseRealm) baseRealm, row, columnInfo, acceptDefaultValue, excludeFields);
9292
checkClass(clazz);
9393

94-
if (clazz.equals(some.test.AllTypes.class)) {
95-
return clazz.cast(new io.realm.some_test_AllTypesRealmProxy());
96-
}
9794
if (clazz.equals(some.test.Simple.class)) {
9895
return clazz.cast(new io.realm.some_test_SimpleRealmProxy());
9996
}
97+
if (clazz.equals(some.test.AllTypes.class)) {
98+
return clazz.cast(new io.realm.some_test_AllTypesRealmProxy());
99+
}
100100
throw getMissingProxyClassException(clazz);
101101
} finally {
102102
objectContext.clear();
@@ -114,14 +114,14 @@ public <E extends RealmModel> E copyOrUpdate(Realm realm, E obj, boolean update,
114114
// generated by RealmProxy or the original type extending directly from RealmObject
115115
@SuppressWarnings("unchecked") Class<E> clazz = (Class<E>) ((obj instanceof RealmObjectProxy) ? obj.getClass().getSuperclass() : obj.getClass());
116116

117-
if (clazz.equals(some.test.AllTypes.class)) {
118-
some_test_AllTypesRealmProxy.AllTypesColumnInfo columnInfo = (some_test_AllTypesRealmProxy.AllTypesColumnInfo) realm.getSchema().getColumnInfo(some.test.AllTypes.class);
119-
return clazz.cast(io.realm.some_test_AllTypesRealmProxy.copyOrUpdate(realm, columnInfo, (some.test.AllTypes) obj, update, cache, flags));
120-
}
121117
if (clazz.equals(some.test.Simple.class)) {
122118
some_test_SimpleRealmProxy.SimpleColumnInfo columnInfo = (some_test_SimpleRealmProxy.SimpleColumnInfo) realm.getSchema().getColumnInfo(some.test.Simple.class);
123119
return clazz.cast(io.realm.some_test_SimpleRealmProxy.copyOrUpdate(realm, columnInfo, (some.test.Simple) obj, update, cache, flags));
124120
}
121+
if (clazz.equals(some.test.AllTypes.class)) {
122+
some_test_AllTypesRealmProxy.AllTypesColumnInfo columnInfo = (some_test_AllTypesRealmProxy.AllTypesColumnInfo) realm.getSchema().getColumnInfo(some.test.AllTypes.class);
123+
return clazz.cast(io.realm.some_test_AllTypesRealmProxy.copyOrUpdate(realm, columnInfo, (some.test.AllTypes) obj, update, cache, flags));
124+
}
125125
throw getMissingProxyClassException(clazz);
126126
}
127127

@@ -131,10 +131,10 @@ public long insert(Realm realm, RealmModel object, Map<RealmModel, Long> cache)
131131
// generated by RealmProxy or the original type extending directly from RealmObject
132132
@SuppressWarnings("unchecked") Class<RealmModel> clazz = (Class<RealmModel>) ((object instanceof RealmObjectProxy) ? object.getClass().getSuperclass() : object.getClass());
133133

134-
if (clazz.equals(some.test.AllTypes.class)) {
135-
return io.realm.some_test_AllTypesRealmProxy.insert(realm, (some.test.AllTypes) object, cache);
136-
} else if (clazz.equals(some.test.Simple.class)) {
134+
if (clazz.equals(some.test.Simple.class)) {
137135
return io.realm.some_test_SimpleRealmProxy.insert(realm, (some.test.Simple) object, cache);
136+
} else if (clazz.equals(some.test.AllTypes.class)) {
137+
return io.realm.some_test_AllTypesRealmProxy.insert(realm, (some.test.AllTypes) object, cache);
138138
} else {
139139
throw getMissingProxyClassException(clazz);
140140
}
@@ -152,18 +152,18 @@ public void insert(Realm realm, Collection<? extends RealmModel> objects) {
152152
// generated by RealmProxy or the original type extending directly from RealmObject
153153
@SuppressWarnings("unchecked") Class<RealmModel> clazz = (Class<RealmModel>) ((object instanceof RealmObjectProxy) ? object.getClass().getSuperclass() : object.getClass());
154154

155-
if (clazz.equals(some.test.AllTypes.class)) {
156-
io.realm.some_test_AllTypesRealmProxy.insert(realm, (some.test.AllTypes) object, cache);
157-
} else if (clazz.equals(some.test.Simple.class)) {
155+
if (clazz.equals(some.test.Simple.class)) {
158156
io.realm.some_test_SimpleRealmProxy.insert(realm, (some.test.Simple) object, cache);
157+
} else if (clazz.equals(some.test.AllTypes.class)) {
158+
io.realm.some_test_AllTypesRealmProxy.insert(realm, (some.test.AllTypes) object, cache);
159159
} else {
160160
throw getMissingProxyClassException(clazz);
161161
}
162162
if (iterator.hasNext()) {
163-
if (clazz.equals(some.test.AllTypes.class)) {
164-
io.realm.some_test_AllTypesRealmProxy.insert(realm, iterator, cache);
165-
} else if (clazz.equals(some.test.Simple.class)) {
163+
if (clazz.equals(some.test.Simple.class)) {
166164
io.realm.some_test_SimpleRealmProxy.insert(realm, iterator, cache);
165+
} else if (clazz.equals(some.test.AllTypes.class)) {
166+
io.realm.some_test_AllTypesRealmProxy.insert(realm, iterator, cache);
167167
} else {
168168
throw getMissingProxyClassException(clazz);
169169
}
@@ -177,10 +177,10 @@ public long insertOrUpdate(Realm realm, RealmModel obj, Map<RealmModel, Long> ca
177177
// generated by RealmProxy or the original type extending directly from RealmObject
178178
@SuppressWarnings("unchecked") Class<RealmModel> clazz = (Class<RealmModel>) ((obj instanceof RealmObjectProxy) ? obj.getClass().getSuperclass() : obj.getClass());
179179

180-
if (clazz.equals(some.test.AllTypes.class)) {
181-
return io.realm.some_test_AllTypesRealmProxy.insertOrUpdate(realm, (some.test.AllTypes) obj, cache);
182-
} else if (clazz.equals(some.test.Simple.class)) {
180+
if (clazz.equals(some.test.Simple.class)) {
183181
return io.realm.some_test_SimpleRealmProxy.insertOrUpdate(realm, (some.test.Simple) obj, cache);
182+
} else if (clazz.equals(some.test.AllTypes.class)) {
183+
return io.realm.some_test_AllTypesRealmProxy.insertOrUpdate(realm, (some.test.AllTypes) obj, cache);
184184
} else {
185185
throw getMissingProxyClassException(clazz);
186186
}
@@ -198,18 +198,18 @@ public void insertOrUpdate(Realm realm, Collection<? extends RealmModel> objects
198198
// generated by RealmProxy or the original type extending directly from RealmObject
199199
@SuppressWarnings("unchecked") Class<RealmModel> clazz = (Class<RealmModel>) ((object instanceof RealmObjectProxy) ? object.getClass().getSuperclass() : object.getClass());
200200

201-
if (clazz.equals(some.test.AllTypes.class)) {
202-
io.realm.some_test_AllTypesRealmProxy.insertOrUpdate(realm, (some.test.AllTypes) object, cache);
203-
} else if (clazz.equals(some.test.Simple.class)) {
201+
if (clazz.equals(some.test.Simple.class)) {
204202
io.realm.some_test_SimpleRealmProxy.insertOrUpdate(realm, (some.test.Simple) object, cache);
203+
} else if (clazz.equals(some.test.AllTypes.class)) {
204+
io.realm.some_test_AllTypesRealmProxy.insertOrUpdate(realm, (some.test.AllTypes) object, cache);
205205
} else {
206206
throw getMissingProxyClassException(clazz);
207207
}
208208
if (iterator.hasNext()) {
209-
if (clazz.equals(some.test.AllTypes.class)) {
210-
io.realm.some_test_AllTypesRealmProxy.insertOrUpdate(realm, iterator, cache);
211-
} else if (clazz.equals(some.test.Simple.class)) {
209+
if (clazz.equals(some.test.Simple.class)) {
212210
io.realm.some_test_SimpleRealmProxy.insertOrUpdate(realm, iterator, cache);
211+
} else if (clazz.equals(some.test.AllTypes.class)) {
212+
io.realm.some_test_AllTypesRealmProxy.insertOrUpdate(realm, iterator, cache);
213213
} else {
214214
throw getMissingProxyClassException(clazz);
215215
}
@@ -222,12 +222,12 @@ public <E extends RealmModel> E createOrUpdateUsingJsonObject(Class<E> clazz, Re
222222
throws JSONException {
223223
checkClass(clazz);
224224

225-
if (clazz.equals(some.test.AllTypes.class)) {
226-
return clazz.cast(io.realm.some_test_AllTypesRealmProxy.createOrUpdateUsingJsonObject(realm, json, update));
227-
}
228225
if (clazz.equals(some.test.Simple.class)) {
229226
return clazz.cast(io.realm.some_test_SimpleRealmProxy.createOrUpdateUsingJsonObject(realm, json, update));
230227
}
228+
if (clazz.equals(some.test.AllTypes.class)) {
229+
return clazz.cast(io.realm.some_test_AllTypesRealmProxy.createOrUpdateUsingJsonObject(realm, json, update));
230+
}
231231
throw getMissingProxyClassException(clazz);
232232
}
233233

@@ -236,12 +236,12 @@ public <E extends RealmModel> E createUsingJsonStream(Class<E> clazz, Realm real
236236
throws IOException {
237237
checkClass(clazz);
238238

239-
if (clazz.equals(some.test.AllTypes.class)) {
240-
return clazz.cast(io.realm.some_test_AllTypesRealmProxy.createUsingJsonStream(realm, reader));
241-
}
242239
if (clazz.equals(some.test.Simple.class)) {
243240
return clazz.cast(io.realm.some_test_SimpleRealmProxy.createUsingJsonStream(realm, reader));
244241
}
242+
if (clazz.equals(some.test.AllTypes.class)) {
243+
return clazz.cast(io.realm.some_test_AllTypesRealmProxy.createUsingJsonStream(realm, reader));
244+
}
245245
throw getMissingProxyClassException(clazz);
246246
}
247247

@@ -251,21 +251,21 @@ public <E extends RealmModel> E createDetachedCopy(E realmObject, int maxDepth,
251251
// generated by RealmProxy or the original type extending directly from RealmObject
252252
@SuppressWarnings("unchecked") Class<E> clazz = (Class<E>) realmObject.getClass().getSuperclass();
253253

254-
if (clazz.equals(some.test.AllTypes.class)) {
255-
return clazz.cast(io.realm.some_test_AllTypesRealmProxy.createDetachedCopy((some.test.AllTypes) realmObject, 0, maxDepth, cache));
256-
}
257254
if (clazz.equals(some.test.Simple.class)) {
258255
return clazz.cast(io.realm.some_test_SimpleRealmProxy.createDetachedCopy((some.test.Simple) realmObject, 0, maxDepth, cache));
259256
}
257+
if (clazz.equals(some.test.AllTypes.class)) {
258+
return clazz.cast(io.realm.some_test_AllTypesRealmProxy.createDetachedCopy((some.test.AllTypes) realmObject, 0, maxDepth, cache));
259+
}
260260
throw getMissingProxyClassException(clazz);
261261
}
262262

263263
@Override
264264
public <E extends RealmModel> boolean isEmbedded(Class<E> clazz) {
265-
if (clazz.equals(some.test.AllTypes.class)) {
265+
if (clazz.equals(some.test.Simple.class)) {
266266
return false;
267267
}
268-
if (clazz.equals(some.test.Simple.class)) {
268+
if (clazz.equals(some.test.AllTypes.class)) {
269269
return false;
270270
}
271271
throw getMissingProxyClassException(clazz);
@@ -277,13 +277,13 @@ public <E extends RealmModel> void updateEmbeddedObject(Realm realm, E unmanaged
277277
// generated by RealmProxy or the original type extending directly from RealmObject
278278
@SuppressWarnings("unchecked") Class<E> clazz = (Class<E>) managedObject.getClass().getSuperclass();
279279

280-
if (clazz.equals(some.test.AllTypes.class)) {
281-
throw getNotEmbeddedClassException("some.test.AllTypes");
282-
} else if (clazz.equals(some.test.Simple.class)) {
280+
if (clazz.equals(some.test.Simple.class)) {
283281
throw getNotEmbeddedClassException("some.test.Simple");
282+
} else if (clazz.equals(some.test.AllTypes.class)) {
283+
throw getNotEmbeddedClassException("some.test.AllTypes");
284284
} else {
285285
throw getMissingProxyClassException(clazz);
286286
}
287287
}
288288

289-
}
289+
}

0 commit comments

Comments
 (0)