private ModelClassMetadata getModelClassMetadata()

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;
  }