All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.infinispan.hotrod.impl.transaction.entry.TransactionEntry Maven / Gradle / Ivy

The newest version!
package org.infinispan.hotrod.impl.transaction.entry;

import static org.infinispan.commons.util.Util.toStr;

import java.time.Duration;
import java.util.function.Function;

import org.infinispan.api.common.CacheEntry;
import org.infinispan.api.common.CacheEntryExpiration;
import org.infinispan.api.common.CacheEntryMetadata;
import org.infinispan.hotrod.impl.cache.CacheEntryMetadataImpl;
import org.infinispan.hotrod.impl.cache.CacheEntryVersionImpl;
import org.infinispan.hotrod.impl.cache.MetadataValue;
import org.infinispan.hotrod.impl.transaction.TransactionContext;

/**
 * An entry in the {@link TransactionContext}.
 * 

* It represents a single key and contains its initial version (if it was read) and the most up-to-date value (can be * null if the key was removed). * * @since 14.0 */ public class TransactionEntry { private final K key; private final long version; //version read. never changes during the transaction private final byte readControl; private V value; //null == removed private CacheEntryMetadata metadata; private boolean modified; private TransactionEntry(K key, long version, byte readControl) { this.key = key; this.version = version; this.readControl = readControl; this.modified = false; } public static TransactionEntry nonExistingEntry(K key) { return new TransactionEntry<>(key, 0, ControlByte.NON_EXISTING.bit()); } public static TransactionEntry notReadEntry(K key) { return new TransactionEntry<>(key, 0, ControlByte.NOT_READ.bit()); } public static TransactionEntry read(K key, MetadataValue value) { TransactionEntry txEntry = new TransactionEntry<>(key, value.getVersion(), (byte) 0); txEntry.value = value.getValue(); CacheEntryExpiration expiration; if (value.getLifespan() < 0) { if (value.getMaxIdle() < 0) { expiration = CacheEntryExpiration.IMMORTAL; } else { expiration = CacheEntryExpiration.withMaxIdle(Duration.ofSeconds(value.getMaxIdle())); } } else { if (value.getMaxIdle() < 0) { expiration = CacheEntryExpiration.withLifespan(Duration.ofSeconds(value.getLifespan())); } else { expiration = CacheEntryExpiration.withLifespanAndMaxIdle(Duration.ofSeconds(value.getLifespan()), Duration.ofSeconds(value.getMaxIdle())); } } txEntry.metadata = new CacheEntryMetadataImpl(value.getCreated(), value.getLastUsed(), expiration, new CacheEntryVersionImpl(value.getVersion())); return txEntry; } public long getVersion() { return version; } public V getValue() { return value; } public boolean isModified() { return modified; } public boolean isNonExists() { return value == null; } public boolean exists() { return value != null; } public void set(CacheEntry entry) { this.value = entry.value(); this.metadata = entry.metadata(); this.modified = true; } public void remove() { this.value = null; this.modified = true; } public Modification toModification(Function keyMarshaller, Function valueMarshaller) { if (value == null) { //remove operation return new Modification(keyMarshaller.apply(key), null, version, metadata.expiration(), ControlByte.REMOVE_OP.set(readControl)); } else { return new Modification(keyMarshaller.apply(key), valueMarshaller.apply(value), version, metadata.expiration(), readControl); } } @Override public String toString() { return "TransactionEntry{" + "key=" + toStr(key) + ", version=" + version + ", readControl=" + ControlByte.prettyPrint(readControl) + ", value=" + toStr(value) + ", expiration=" + metadata.expiration() + ", modified=" + modified + '}'; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy