diff options
Diffstat (limited to 'framework/src/onos/core/api/src/main/java/org/onosproject/store/service/Versioned.java')
-rw-r--r-- | framework/src/onos/core/api/src/main/java/org/onosproject/store/service/Versioned.java | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/framework/src/onos/core/api/src/main/java/org/onosproject/store/service/Versioned.java b/framework/src/onos/core/api/src/main/java/org/onosproject/store/service/Versioned.java new file mode 100644 index 00000000..89bd3029 --- /dev/null +++ b/framework/src/onos/core/api/src/main/java/org/onosproject/store/service/Versioned.java @@ -0,0 +1,138 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.store.service; + +import java.util.function.Function; + +import org.joda.time.DateTime; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Objects; + +/** + * Versioned value. + * + * @param <V> value type. + */ +public class Versioned<V> { + + private final V value; + private final long version; + private final long creationTime; + + /** + * Constructs a new versioned value. + * @param value value + * @param version version + * @param creationTime milliseconds of the creation event + * from the Java epoch of 1970-01-01T00:00:00Z + */ + public Versioned(V value, long version, long creationTime) { + this.value = value; + this.version = version; + this.creationTime = creationTime; + } + + /** + * Constructs a new versioned value. + * @param value value + * @param version version + */ + public Versioned(V value, long version) { + this(value, version, System.currentTimeMillis()); + } + + /** + * Returns the value. + * + * @return value. + */ + public V value() { + return value; + } + + /** + * Returns the version. + * + * @return version + */ + public long version() { + return version; + } + + /** + * Returns the system time when this version was created. + * <p> + * Care should be taken when relying on creationTime to + * implement any behavior in a distributed setting. Due + * to the possibility of clock skew it is likely that + * even creationTimes of causally related versions can be + * out or order. + * @return creation time + */ + public long creationTime() { + return creationTime; + } + + /** + * Maps this instance into another after transforming its + * value while retaining the same version and creationTime. + * @param transformer function for mapping the value + * @param <U> value type of the returned instance + * @return mapped instance + */ + public <U> Versioned<U> map(Function<V, U> transformer) { + return new Versioned<>(transformer.apply(value), version, creationTime); + } + + /** + * Returns the value of the specified Versioned object if non-null or else returns + * a default value. + * @param versioned versioned object + * @param defaultValue default value to return if versioned object is null + * @param <U> type of the versioned value + * @return versioned value or default value if versioned object is null + */ + public static <U> U valueOrElse(Versioned<U> versioned, U defaultValue) { + return versioned == null ? defaultValue : versioned.value(); + } + + @Override + public int hashCode() { + return Objects.hashCode(value, version, creationTime); + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof Versioned)) { + return false; + } + Versioned<V> that = (Versioned) other; + return Objects.equal(this.value, that.value) && + Objects.equal(this.version, that.version) && + Objects.equal(this.creationTime, that.creationTime); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("value", value) + .add("version", version) + .add("creationTime", new DateTime(creationTime)) + .toString(); + } +} |