Skip to content

Commit 11c1ad8

Browse files
committed
DATACMNS-1079 - Polishing.
Remove javadoc params without documentation. Reorder methods in the order they are called. Rename arePropertyHashCodesUnique to hasUniquePropertyHashCodes. Add author tag. Formatting. Original pull request: #224.
1 parent 497dc08 commit 11c1ad8

File tree

1 file changed

+27
-135
lines changed

1 file changed

+27
-135
lines changed

src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java

+27-135
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
* @author Mark Paluch
6262
* @author Oliver Gierke
6363
* @author Christoph Strobl
64+
* @author Jens Schauder
6465
* @since 1.13
6566
*/
6667
public class ClassGeneratingPropertyAccessorFactory implements PersistentPropertyAccessorFactory {
@@ -91,7 +92,7 @@ public PersistentPropertyAccessor getPropertyAccessor(PersistentEntity<?, ?> ent
9192
/**
9293
* Checks whether an accessor class can be generated.
9394
*
94-
* @param entity
95+
* @param entity must not be {@literal null}.
9596
* @return {@literal true} if the runtime is equal or greater to Java 1.7, we can access the ClassLoader, the property
9697
* name hash codes are unique and the type has a class loader we can use to re-inject types.
9798
* @see PersistentPropertyAccessorFactory#isSupported(PersistentEntity)
@@ -101,15 +102,27 @@ public boolean isSupported(PersistentEntity<?, ?> entity) {
101102

102103
Assert.notNull(entity, "PersistentEntity must not be null!");
103104

104-
return isClassLoaderDefineClassAccessible(entity) //
105-
&& isTypeInjectable(entity) //
106-
&& arePropertyHashCodesUnique(entity);
105+
return isClassLoaderDefineClassAccessible(entity) && isTypeInjectable(entity) && hasUniquePropertyHashCodes(entity);
106+
}
107+
108+
private static boolean isClassLoaderDefineClassAccessible(PersistentEntity<?, ?> entity) {
109+
110+
try {
111+
Evil.getClassLoaderMethod(entity);
112+
} catch (Exception o_O) {
113+
return false;
114+
}
115+
return true;
116+
}
117+
118+
private static boolean isTypeInjectable(PersistentEntity<?, ?> entity) {
119+
return entity.getType().getClassLoader() != null && !entity.getType().getPackage().getName().startsWith("java");
107120
}
108121

109-
private boolean arePropertyHashCodesUnique(PersistentEntity<?, ?> entity) {
122+
private boolean hasUniquePropertyHashCodes(PersistentEntity<?, ?> entity) {
110123

111-
final Set<Integer> hashCodes = new HashSet<>();
112-
final AtomicInteger propertyCount = new AtomicInteger();
124+
Set<Integer> hashCodes = new HashSet<>();
125+
AtomicInteger propertyCount = new AtomicInteger();
113126

114127
entity.doWithProperties((SimplePropertyHandler) property -> {
115128

@@ -129,23 +142,8 @@ private boolean arePropertyHashCodesUnique(PersistentEntity<?, ?> entity) {
129142
return hashCodes.size() == propertyCount.get();
130143
}
131144

132-
private static boolean isTypeInjectable(PersistentEntity<?, ?> entity) {
133-
return entity.getType().getClassLoader() != null && !entity.getType().getPackage().getName().startsWith("java");
134-
}
135-
136-
private static boolean isClassLoaderDefineClassAccessible(PersistentEntity<?, ?> entity) {
137-
138-
try {
139-
Evil.getClassLoaderMethod(entity);
140-
} catch (Exception o_O) {
141-
return false;
142-
}
143-
return true;
144-
}
145-
146145
/**
147146
* @param entity must not be {@literal null}.
148-
* @return
149147
*/
150148
private synchronized Class<PersistentPropertyAccessor> potentiallyCreateAndRegisterPersistentPropertyAccessorClass(
151149
PersistentEntity<?, ?> entity) {
@@ -277,28 +275,19 @@ static class PropertyAccessorClassGenerator {
277275

278276
/**
279277
* Generate a new class for the given {@link PersistentEntity}.
280-
*
281-
* @param entity
282-
* @return
283278
*/
284-
public static Class<?> generateCustomAccessorClass(PersistentEntity<?, ?> entity) {
279+
static Class<?> generateCustomAccessorClass(PersistentEntity<?, ?> entity) {
285280

286281
String className = generateClassName(entity);
287282
byte[] bytecode = generateBytecode(className.replace('.', '/'), entity);
288283

289-
Class<?> accessorClass = Evil.defineClass(className, bytecode, 0, bytecode.length, entity);
290-
291-
return accessorClass;
284+
return Evil.defineClass(className, bytecode, 0, bytecode.length, entity);
292285
}
293286

294287
/**
295288
* Generate a new class for the given {@link PersistentEntity}.
296-
*
297-
* @param internalClassName
298-
* @param entity
299-
* @return
300289
*/
301-
public static byte[] generateBytecode(String internalClassName, PersistentEntity<?, ?> entity) {
290+
static byte[] generateBytecode(String internalClassName, PersistentEntity<?, ?> entity) {
302291

303292
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
304293
cw.visit(Opcodes.V1_6, ACC_PUBLIC + ACC_SUPER, internalClassName, null, JAVA_LANG_OBJECT, IMPLEMENTED_INTERFACES);
@@ -344,10 +333,6 @@ private static List<PersistentProperty<?>> getPersistentProperties(PersistentEnt
344333
* // ...
345334
* }
346335
* </pre>
347-
*
348-
* @param entity
349-
* @param persistentProperties
350-
* @param cw
351336
*/
352337
private static void visitFields(PersistentEntity<?, ?> entity, List<PersistentProperty<?>> persistentProperties,
353338
ClassWriter cw) {
@@ -394,10 +379,6 @@ private static void visitFields(PersistentEntity<?, ?> entity, List<PersistentPr
394379
* }
395380
* }
396381
* </pre>
397-
*
398-
* @param entity
399-
* @param internalClassName
400-
* @param cw
401382
*/
402383
private static void visitDefaultConstructor(PersistentEntity<?, ?> entity, String internalClassName,
403384
ClassWriter cw) {
@@ -466,11 +447,6 @@ private static void visitDefaultConstructor(PersistentEntity<?, ?> entity, Strin
466447
* // ...
467448
* }
468449
* </pre>
469-
*
470-
* @param entity
471-
* @param persistentProperties
472-
* @param internalClassName
473-
* @param cw
474450
*/
475451
private static void visitStaticInitializer(PersistentEntity<?, ?> entity,
476452
List<PersistentProperty<?>> persistentProperties, String internalClassName, ClassWriter cw) {
@@ -532,9 +508,6 @@ private static void visitStaticInitializer(PersistentEntity<?, ?> entity,
532508
/**
533509
* Retrieve all classes which are involved in property/getter/setter declarations as these elements may be
534510
* distributed across the type hierarchy.
535-
*
536-
* @param persistentProperties
537-
* @return
538511
*/
539512
private static List<Class<?>> getPropertyDeclaratingClasses(List<PersistentProperty<?>> persistentProperties) {
540513

@@ -549,11 +522,6 @@ private static List<Class<?>> getPropertyDeclaratingClasses(List<PersistentPrope
549522

550523
/**
551524
* Generate property getter initializer.
552-
*
553-
* @param property
554-
* @param mv
555-
* @param entityClasses
556-
* @param internalClassName
557525
*/
558526
private static void visitPropertyGetterInitializer(PersistentProperty<?> property, MethodVisitor mv,
559527
List<Class<?>> entityClasses, String internalClassName) {
@@ -594,11 +562,6 @@ private static void visitPropertyGetterInitializer(PersistentProperty<?> propert
594562

595563
/**
596564
* Generate property setter initializer.
597-
*
598-
* @param property
599-
* @param mv
600-
* @param entityClasses
601-
* @param internalClassName
602565
*/
603566
private static void visitPropertySetterInitializer(PersistentProperty<?> property, MethodVisitor mv,
604567
List<Class<?>> entityClasses, String internalClassName) {
@@ -653,11 +616,6 @@ private static void visitPropertySetterInitializer(PersistentProperty<?> propert
653616

654617
/**
655618
* Generate field getter and setter initializers.
656-
*
657-
* @param property
658-
* @param mv
659-
* @param entityClasses
660-
* @param internalClassName
661619
*/
662620
private static void visitFieldGetterSetterInitializer(PersistentProperty<?> property, MethodVisitor mv,
663621
List<Class<?>> entityClasses, String internalClassName) {
@@ -744,11 +702,6 @@ private static void visitBeanGetter(PersistentEntity<?, ?> entity, String intern
744702
* }
745703
* }
746704
* </pre>
747-
*
748-
* @param entity
749-
* @param persistentProperties
750-
* @param internalClassName
751-
* @param cw
752705
*/
753706
private static void visitGetProperty(PersistentEntity<?, ?> entity,
754707
List<PersistentProperty<?>> persistentProperties, String internalClassName, ClassWriter cw) {
@@ -795,11 +748,6 @@ private static void visitGetProperty(PersistentEntity<?, ?> entity,
795748

796749
/**
797750
* Generate the {@code switch(hashcode) {label: }} block.
798-
*
799-
* @param entity
800-
* @param persistentProperties
801-
* @param internalClassName
802-
* @param mv
803751
*/
804752
private static void visitGetPropertySwitch(PersistentEntity<?, ?> entity,
805753
List<PersistentProperty<?>> persistentProperties, String internalClassName, MethodVisitor mv) {
@@ -846,11 +794,6 @@ private static void visitGetPropertySwitch(PersistentEntity<?, ?> entity,
846794
* Generate property read access using a {@link java.lang.invoke.MethodHandle}.
847795
* {@link java.lang.invoke.MethodHandle#invoke(Object...)} have a {@code @PolymorphicSignature} so {@code invoke} is
848796
* called as if the method had the expected signature and not array/varargs.
849-
*
850-
* @param entity
851-
* @param property
852-
* @param mv
853-
* @param internalClassName
854797
*/
855798
private static void visitGetProperty0(PersistentEntity<?, ?> entity, PersistentProperty<?> property,
856799
MethodVisitor mv, String internalClassName) {
@@ -912,7 +855,7 @@ private static void visitGetProperty0(PersistentEntity<?, ?> entity, PersistentP
912855
}
913856

914857
/**
915-
* Generate the {@link PersistentPropertyAccessor#setProperty(PersistentProperty, Object)} method. *
858+
* Generate the {@link PersistentPropertyAccessor#setProperty(PersistentProperty, Optional)} method. *
916859
*
917860
* <pre>
918861
* {
@@ -930,11 +873,6 @@ private static void visitGetProperty0(PersistentEntity<?, ?> entity, PersistentP
930873
* }
931874
* }
932875
* </pre>
933-
*
934-
* @param entity
935-
* @param persistentProperties
936-
* @param internalClassName
937-
* @param cw
938876
*/
939877
private static void visitSetProperty(PersistentEntity<?, ?> entity,
940878
List<PersistentProperty<?>> persistentProperties, String internalClassName, ClassWriter cw) {
@@ -996,11 +934,6 @@ private static void visitUnwrapValue(MethodVisitor mv) {
996934

997935
/**
998936
* Generate the {@code switch(hashcode) {label: }} block.
999-
*
1000-
* @param entity
1001-
* @param persistentProperties
1002-
* @param internalClassName
1003-
* @param mv
1004937
*/
1005938
private static void visitSetPropertySwitch(PersistentEntity<?, ?> entity,
1006939
List<PersistentProperty<?>> persistentProperties, String internalClassName, MethodVisitor mv) {
@@ -1045,11 +978,6 @@ private static void visitSetPropertySwitch(PersistentEntity<?, ?> entity,
1045978
* Generate property write access using a {@link java.lang.invoke.MethodHandle}. NOTE:
1046979
* {@link java.lang.invoke.MethodHandle#invoke(Object...)} have a {@code @PolymorphicSignature} so {@code invoke} is
1047980
* called as if the method had the expected signature and not array/varargs.
1048-
*
1049-
* @param entity
1050-
* @param property
1051-
* @param mv
1052-
* @param internalClassName
1053981
*/
1054982
private static void visitSetProperty0(PersistentEntity<?, ?> entity, PersistentProperty<?> property,
1055983
MethodVisitor mv, String internalClassName) {
@@ -1178,11 +1106,7 @@ private static boolean isAccessible(int modifiers) {
11781106

11791107
private static boolean isDefault(int modifiers) {
11801108

1181-
if (Modifier.isPrivate(modifiers) || Modifier.isProtected(modifiers) || Modifier.isPublic(modifiers)) {
1182-
return false;
1183-
}
1184-
1185-
return true;
1109+
return !(Modifier.isPrivate(modifiers) || Modifier.isProtected(modifiers) || Modifier.isPublic(modifiers));
11861110
}
11871111

11881112
private static boolean generateSetterMethodHandle(PersistentEntity<?, ?> entity, Field field) {
@@ -1193,10 +1117,6 @@ private static boolean generateSetterMethodHandle(PersistentEntity<?, ?> entity,
11931117
* Check whether to generate {@link java.lang.invoke.MethodHandle} access. Checks visibility rules of the member and
11941118
* its declaring class. Use also {@link java.lang.invoke.MethodHandle} if visibility is protected/package-default
11951119
* and packages of the declaring types are different.
1196-
*
1197-
* @param entity
1198-
* @param member
1199-
* @return
12001120
*/
12011121
private static boolean generateMethodHandle(PersistentEntity<?, ?> entity, Member member) {
12021122

@@ -1217,19 +1137,11 @@ private static boolean generateMethodHandle(PersistentEntity<?, ?> entity, Membe
12171137

12181138
/**
12191139
* Retrieves the class variable index with an offset of {@code 4}.
1220-
*
1221-
* @param list
1222-
* @param item
1223-
* @return
12241140
*/
12251141
private static int classVariableIndex4(List<Class<?>> list, Class<?> item) {
12261142
return 4 + list.indexOf(item);
12271143
}
12281144

1229-
/**
1230-
* @param entity
1231-
* @return
1232-
*/
12331145
private static String generateClassName(PersistentEntity<?, ?> entity) {
12341146
return entity.getType().getName() + TAG + Integer.toString(entity.hashCode(), 36);
12351147
}
@@ -1259,9 +1171,6 @@ private static Map<String, PropertyStackAddress> createPropertyStackMap(
12591171

12601172
/**
12611173
* Returns the appropriate autoboxing type.
1262-
*
1263-
* @param unboxed
1264-
* @return
12651174
*/
12661175
private static Class<?> autoboxType(Class<?> unboxed) {
12671176

@@ -1380,9 +1289,6 @@ private static void autoboxIfNeeded(Class<?> in, Class<?> out, MethodVisitor vis
13801289

13811290
/**
13821291
* Returns the signature type for a {@link Class} including primitives.
1383-
*
1384-
* @param type must not be {@literal null}.
1385-
* @return
13861292
*/
13871293
private static String signatureTypeName(Class<?> type) {
13881294

@@ -1459,13 +1365,6 @@ private static class Evil {
14591365

14601366
/**
14611367
* Define a Class in the {@link ClassLoader} of the {@link PersistentEntity} type.
1462-
*
1463-
* @param name
1464-
* @param bytes
1465-
* @param offset
1466-
* @param len
1467-
* @param persistentEntity
1468-
* @return
14691368
*/
14701369
Class<?> defineClass(String name, byte[] bytes, int offset, int len, PersistentEntity<?, ?> persistentEntity) {
14711370

@@ -1488,15 +1387,8 @@ static Method getClassLoaderMethod(PersistentEntity<?, ?> entity) {
14881387
ClassLoader classLoader = entity.getType().getClassLoader();
14891388
Class<?> classLoaderClass = classLoader.getClass();
14901389

1491-
Method defineClass = ReflectionUtils.findMethod( //
1492-
classLoaderClass, //
1493-
"defineClass", //
1494-
String.class, //
1495-
byte[].class, //
1496-
Integer.TYPE, //
1497-
Integer.TYPE, //
1498-
ProtectionDomain.class //
1499-
);
1390+
Method defineClass = ReflectionUtils.findMethod(classLoaderClass, "defineClass", String.class, byte[].class,
1391+
Integer.TYPE, Integer.TYPE, ProtectionDomain.class);
15001392

15011393
defineClass.setAccessible(true);
15021394

0 commit comments

Comments
 (0)