001package com.nimbusds.infinispan.persistence.dynamodb; 002 003 004import com.amazonaws.services.dynamodbv2.document.Item; 005import com.nimbusds.infinispan.persistence.common.InternalMetadataBuilder; 006import org.infinispan.metadata.InternalMetadata; 007 008 009/** 010 * Infinispan metadata persistence utilities. 011 */ 012public class MetadataUtils { 013 014 015 /** 016 * Adds Infinispan metadata to the specified DynamoDB item. 017 * 018 * <p>Each metadata timestamp, if set (greater than -1) is encoded as 019 * long integer representing the number of milliseconds since the Unix 020 * spec: 021 * 022 * <ul> 023 * <li>created - "iat" 024 * <li>lifespan - "max" 025 * <li>max idle - "idl" 026 * <li>last used - "lat" 027 * </ul> 028 * 029 * @param item The DynamoDB item. 030 * @param metadata The Infinispan metadata, {@code null} if not 031 * specified. 032 * 033 * @return The DynamoDB item. 034 */ 035 public static Item addMetadata(final Item item, final InternalMetadata metadata) { 036 037 return addMetadata(item, metadata, false); 038 } 039 040 041 /** 042 * Adds Infinispan metadata to the specified DynamoDB item. 043 * 044 * <p>Each metadata timestamp, if set (greater than -1) is encoded as 045 * long integer representing the number of milliseconds since the Unix 046 * spec: 047 * 048 * <ul> 049 * <li>created - "iat" 050 * <li>lifespan - "max" 051 * <li>max idle - "idl" 052 * <li>last used - "lat" 053 * <li>automatic DynamoDB item expiration - "ttl" 054 * </ul> 055 * 056 * @param item The DynamoDB item. 057 * @param metadata The Infinispan metadata, {@code null} if not 058 * specified. 059 * @param withTTL {@code true} to include a "ttl" attribute as Unix 060 * Unix timestamp, with second precision, for automatic 061 * DynamoDB item expiration. 062 * 063 * @return The DynamoDB item. 064 */ 065 public static Item addMetadata(final Item item, final InternalMetadata metadata, final boolean withTTL) { 066 067 if (metadata == null) { 068 return item; 069 } 070 071 if (metadata.created() > -1) { 072 item.withLong("iat", metadata.created()); 073 } 074 075 if (metadata.lifespan() > -1) { 076 item.withLong("max", metadata.lifespan()); 077 } 078 079 if (metadata.maxIdle() > -1) { 080 item.withLong("idl", metadata.maxIdle()); 081 } 082 083 if (metadata.lastUsed() > -1) { 084 item.withLong("lat", metadata.lastUsed()); 085 } 086 087 if (withTTL && metadata.created() > -1 && metadata.lifespan() > -1) { 088 item.withLong("ttl", (metadata.created() + metadata.lifespan()) / 1000); 089 } 090 091 return item; 092 } 093 094 095 /** 096 * Parses Infinispan metadata encoded with {@link #addMetadata} from 097 * the specified DynamoDB item. 098 * 099 * @param item The DynamoDB item. 100 * 101 * @return The Infinispan metadata. 102 */ 103 public static InternalMetadata parseMetadata(final Item item) { 104 105 InternalMetadataBuilder b = new InternalMetadataBuilder(); 106 107 if (item.hasAttribute("iat")) { 108 b.created(item.getLong("iat")); 109 } 110 111 if (item.hasAttribute("max")) { 112 b.lifespan(item.getLong("max")); 113 } 114 115 if (item.hasAttribute("idl")) { 116 b.maxIdle(item.getLong("idl")); 117 } 118 119 if (item.hasAttribute("lat")) { 120 b.lastUsed(item.getLong("lat")); 121 } 122 123 return b.build(); 124 } 125}