private ModelClassMetadata getModelClassMetadata()

in sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/AttributeEncryptor.java [140:189]


  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>> attributeFlags = 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);
          }
          attributeFlags.put(mapping.getAttributeName(), Collections.unmodifiableSet(flags));
        }

        if (handleUnknownAttributes) {
          unknownAttributeBehavior.add(EncryptionFlags.SIGN);

          if (shouldEncrypt(clazz)) {
            unknownAttributeBehavior.add(EncryptionFlags.ENCRYPT);
          }
        }
      }

      metadata =
          new ModelClassMetadata(
              Collections.unmodifiableMap(attributeFlags),
              doNotTouch(clazz),
              Collections.unmodifiableSet(unknownAttributeBehavior));
      metadataCache.put(clazz, metadata);
    }
    return metadata;
  }