in DynamoDbEncryption/runtimes/java/src/main/sdkv1/com/amazonaws/services/dynamodbv2/datamodeling/AttributeEncryptor.java [162:223]
private <T> ModelClassMetadata getModelClassMetadata(
Parameters<T> parameters
) {
// Due to the lack of explicit synchronization, it is possible that
// elements in the cache will be added multiple times. Since they will
// all be identical, this is okay. Avoiding explicit synchronization
// means that in the general (retrieval) case, should never block and
// should be extremely fast.
final Class<T> clazz = parameters.getModelClass();
ModelClassMetadata metadata = metadataCache.get(clazz);
if (metadata == null) {
Map<String, Set<EncryptionFlags>> attributeActionsOnEncrypt =
new HashMap<>();
final boolean handleUnknownAttributes = handleUnknownAttributes(clazz);
final EnumSet<EncryptionFlags> unknownAttributeBehavior = EnumSet.noneOf(
EncryptionFlags.class
);
if (shouldTouch(clazz)) {
Mappings mappings = DynamoDBMappingsRegistry
.instance()
.mappingsOf(clazz);
for (Mapping mapping : mappings.getMappings()) {
final EnumSet<EncryptionFlags> flags = EnumSet.noneOf(
EncryptionFlags.class
);
StandardAnnotationMaps.FieldMap<?> fieldMap =
StandardAnnotationMaps.of(mapping.getter(), null);
if (shouldTouch(fieldMap)) {
if (shouldEncryptAttribute(clazz, mapping, fieldMap)) {
flags.add(EncryptionFlags.ENCRYPT);
}
flags.add(EncryptionFlags.SIGN);
}
attributeActionsOnEncrypt.put(
mapping.getAttributeName(),
Collections.unmodifiableSet(flags)
);
}
if (handleUnknownAttributes) {
unknownAttributeBehavior.add(EncryptionFlags.SIGN);
if (shouldEncrypt(clazz)) {
unknownAttributeBehavior.add(EncryptionFlags.ENCRYPT);
}
}
}
metadata =
new ModelClassMetadata(
Collections.unmodifiableMap(attributeActionsOnEncrypt),
doNotTouch(clazz),
Collections.unmodifiableSet(unknownAttributeBehavior)
);
metadataCache.put(clazz, metadata);
}
return metadata;
}