package org.infinispan.server.memcached;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import org.infinispan.container.versioning.EntryVersion;
import org.infinispan.metadata.EmbeddedMetadata;
import org.infinispan.metadata.Metadata;
/**
* Memcached metadata information.
*
* @author Galder ZamarreƱo
* @since 5.3
*/
public class MemcachedMetadata implements Metadata {
protected final long flags;
protected final EntryVersion version;
public MemcachedMetadata(long flags, EntryVersion version) {
this.flags = flags;
this.version = Objects.requireNonNull(version);
}
@Override
public long lifespan() {
return -1;
}
@Override
public long maxIdle() {
return -1;
}
@Override
public EntryVersion version() {
return version;
}
@Override
public Builder builder() {
return new MemcachedMetadataBuilder().flags(flags).version(version);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MemcachedMetadata that = (MemcachedMetadata) o;
if (flags != that.flags) return false;
return version.equals(that.version);
}
@Override
public int hashCode() {
int result = (int) (flags ^ (flags >>> 32));
result = 31 * result + version.hashCode();
return result;
}
@Override
public String toString() {
return "MemcachedMetadata{" +
"flags=" + flags +
", version=" + version +
'}';
}
}
class MemcachedExpirableMetadata extends MemcachedMetadata {
protected final long lifespanTime;
protected final TimeUnit lifespanUnit;
MemcachedExpirableMetadata(long flags, EntryVersion version, long lifespanTime, TimeUnit lifespanUnit) {
super(flags, version);
this.lifespanTime = lifespanTime;
this.lifespanUnit = Objects.requireNonNull(lifespanUnit);
}
@Override
public long lifespan() {
return lifespanUnit.toMillis(lifespanTime);
}
@Override
public Builder builder() {
return new MemcachedMetadataBuilder().flags(flags).version(version).lifespan(lifespanTime, lifespanUnit);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
MemcachedExpirableMetadata that = (MemcachedExpirableMetadata) o;
if (lifespanTime != that.lifespanTime) return false;
return lifespanUnit == that.lifespanUnit;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (int) (lifespanTime ^ (lifespanTime >>> 32));
result = 31 * result + lifespanUnit.hashCode();
return result;
}
@Override
public String toString() {
return "MemcachedExpirableMetadata{" +
"flags=" + flags +
", version=" + version +
", lifespanTime=" + lifespanTime +
", lifespanUnit=" + lifespanUnit +
"} ";
}
}
class MemcachedMetadataBuilder extends EmbeddedMetadata.Builder {
private long flags;
MemcachedMetadataBuilder flags(long flags) {
this.flags = flags;
return this;
}
@Override
public Metadata build() {
if (hasLifespan())
return new MemcachedExpirableMetadata(flags, version, lifespan, lifespanUnit);
else
return new MemcachedMetadata(flags, version);
}
}