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}