/**
* Copyright 2016 ZTE Corporation.
*
* 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.openo.msb.wrapper.consul.option;
import com.google.common.base.MoreObjects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.primitives.Booleans;
import java.math.BigInteger;
import java.util.ArrayList;
import javax.annotation.Generated;
/**
* Immutable implementation of {@link QueryOptions}.
*
* Use the builder to create immutable instances:
* {@code ImmutableQueryOptions.builder()}.
*/
@SuppressWarnings("all")
@Generated({"Immutables.generator", "QueryOptions"})
public final class ImmutableQueryOptions extends QueryOptions {
private final Optional wait;
private final Optional token;
private final Optional index;
private final Optional near;
private final ConsistencyMode consistencyMode;
private final boolean isBlocking;
private final boolean hasToken;
private ImmutableQueryOptions(ImmutableQueryOptions.Builder builder) {
this.wait = builder.wait;
this.token = builder.token;
this.index = builder.index;
this.near = builder.near;
if (builder.consistencyMode != null) {
initShim.consistencyMode(builder.consistencyMode);
}
this.consistencyMode = initShim.getConsistencyMode();
this.isBlocking = initShim.isBlocking();
this.hasToken = initShim.hasToken();
this.initShim = null;
}
private ImmutableQueryOptions(
Optional wait,
Optional token,
Optional index,
Optional near,
ConsistencyMode consistencyMode) {
this.wait = wait;
this.token = token;
this.index = index;
this.near = near;
this.consistencyMode = consistencyMode;
initShim.consistencyMode(consistencyMode);
this.isBlocking = initShim.isBlocking();
this.hasToken = initShim.hasToken();
this.initShim = null;
}
private static final int STAGE_INITIALIZING = -1;
private static final int STAGE_UNINITIALIZED = 0;
private static final int STAGE_INITIALIZED = 1;
private volatile InitShim initShim = new InitShim();
private final class InitShim {
private ConsistencyMode consistencyMode;
private byte consistencyModeStage;
ConsistencyMode getConsistencyMode() {
if (consistencyModeStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
if (consistencyModeStage == STAGE_UNINITIALIZED) {
consistencyModeStage = STAGE_INITIALIZING;
this.consistencyMode = Preconditions.checkNotNull(ImmutableQueryOptions.super.getConsistencyMode(), "consistencyMode");
consistencyModeStage = STAGE_INITIALIZED;
}
return consistencyMode;
}
ConsistencyMode consistencyMode(ConsistencyMode value) {
this.consistencyMode = value;
consistencyModeStage = STAGE_INITIALIZED;
return value;
}
private boolean isBlocking;
private byte isBlockingStage;
boolean isBlocking() {
if (isBlockingStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
if (isBlockingStage == STAGE_UNINITIALIZED) {
isBlockingStage = STAGE_INITIALIZING;
this.isBlocking = ImmutableQueryOptions.super.isBlocking();
isBlockingStage = STAGE_INITIALIZED;
}
return isBlocking;
}
private boolean hasToken;
private byte hasTokenStage;
boolean hasToken() {
if (hasTokenStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
if (hasTokenStage == STAGE_UNINITIALIZED) {
hasTokenStage = STAGE_INITIALIZING;
this.hasToken = ImmutableQueryOptions.super.hasToken();
hasTokenStage = STAGE_INITIALIZED;
}
return hasToken;
}
private String formatInitCycleMessage() {
ArrayList attributes = Lists.newArrayList();
if (consistencyModeStage == STAGE_INITIALIZING) attributes.add("consistencyMode");
if (isBlockingStage == STAGE_INITIALIZING) attributes.add("isBlocking");
if (hasTokenStage == STAGE_INITIALIZING) attributes.add("hasToken");
return "Cannot build QueryOptions, attribute initializers form cycle" + attributes;
}
}
/**
* @return The value of the {@code wait} attribute
*/
@Override
public Optional getWait() {
return wait;
}
/**
* @return The value of the {@code token} attribute
*/
@Override
public Optional getToken() {
return token;
}
/**
* @return The value of the {@code index} attribute
*/
@Override
public Optional getIndex() {
return index;
}
/**
* @return The value of the {@code near} attribute
*/
@Override
public Optional getNear() {
return near;
}
/**
* @return The value of the {@code consistencyMode} attribute
*/
@Override
public ConsistencyMode getConsistencyMode() {
return initShim != null
? initShim.getConsistencyMode()
: consistencyMode;
}
/**
* @return The computed-at-construction value of the {@code isBlocking} attribute
*/
@Override
public boolean isBlocking() {
return initShim != null
? initShim.isBlocking()
: isBlocking;
}
/**
* @return The computed-at-construction value of the {@code hasToken} attribute
*/
@Override
public boolean hasToken() {
return initShim != null
? initShim.hasToken()
: hasToken;
}
/**
* Copy the current immutable object by setting a present value for the optional {@link QueryOptions#getWait() wait} attribute.
* @param value The value for wait
* @return A modified copy of {@code this} object
*/
public final ImmutableQueryOptions withWait(String value) {
Optional newValue = Optional.of(value);
return validate(new ImmutableQueryOptions(newValue, this.token, this.index, this.near, this.consistencyMode));
}
/**
* Copy the current immutable object by setting an optional value for the {@link QueryOptions#getWait() wait} attribute.
* A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
* @param optional A value for wait
* @return A modified copy of {@code this} object
*/
public final ImmutableQueryOptions withWait(Optional optional) {
Optional value = Preconditions.checkNotNull(optional, "wait");
if (this.wait == value) return this;
return validate(new ImmutableQueryOptions(value, this.token, this.index, this.near, this.consistencyMode));
}
/**
* Copy the current immutable object by setting a present value for the optional {@link QueryOptions#getToken() token} attribute.
* @param value The value for token
* @return A modified copy of {@code this} object
*/
public final ImmutableQueryOptions withToken(String value) {
Optional newValue = Optional.of(value);
return validate(new ImmutableQueryOptions(this.wait, newValue, this.index, this.near, this.consistencyMode));
}
/**
* Copy the current immutable object by setting an optional value for the {@link QueryOptions#getToken() token} attribute.
* A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
* @param optional A value for token
* @return A modified copy of {@code this} object
*/
public final ImmutableQueryOptions withToken(Optional optional) {
Optional value = Preconditions.checkNotNull(optional, "token");
if (this.token == value) return this;
return validate(new ImmutableQueryOptions(this.wait, value, this.index, this.near, this.consistencyMode));
}
/**
* Copy the current immutable object by setting a present value for the optional {@link QueryOptions#getIndex() index} attribute.
* @param value The value for index
* @return A modified copy of {@code this} object
*/
public final ImmutableQueryOptions withIndex(BigInteger value) {
Optional newValue = Optional.of(value);
return validate(new ImmutableQueryOptions(this.wait, this.token, newValue, this.near, this.consistencyMode));
}
/**
* Copy the current immutable object by setting an optional value for the {@link QueryOptions#getIndex() index} attribute.
* A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
* @param optional A value for index
* @return A modified copy of {@code this} object
*/
public final ImmutableQueryOptions withIndex(Optional optional) {
Optional value = Preconditions.checkNotNull(optional, "index");
if (this.index == value) return this;
return validate(new ImmutableQueryOptions(this.wait, this.token, value, this.near, this.consistencyMode));
}
/**
* Copy the current immutable object by setting a present value for the optional {@link QueryOptions#getNear() near} attribute.
* @param value The value for near
* @return A modified copy of {@code this} object
*/
public final ImmutableQueryOptions withNear(String value) {
Optional newValue = Optional.of(value);
return validate(new ImmutableQueryOptions(this.wait, this.token, this.index, newValue, this.consistencyMode));
}
/**
* Copy the current immutable object by setting an optional value for the {@link QueryOptions#getNear() near} attribute.
* A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
* @param optional A value for near
* @return A modified copy of {@code this} object
*/
public final ImmutableQueryOptions withNear(Optional optional) {
Optional value = Preconditions.checkNotNull(optional, "near");
if (this.near == value) return this;
return validate(new ImmutableQueryOptions(this.wait, this.token, this.index, value, this.consistencyMode));
}
/**
* Copy the current immutable object by setting a value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute.
* A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
* @param value A new value for consistencyMode
* @return A modified copy of the {@code this} object
*/
public final ImmutableQueryOptions withConsistencyMode(ConsistencyMode value) {
if (this.consistencyMode == value) return this;
return validate(new ImmutableQueryOptions(
this.wait,
this.token,
this.index,
this.near,
Preconditions.checkNotNull(value, "consistencyMode")));
}
/**
* This instance is equal to all instances of {@code ImmutableQueryOptions} that have equal attribute values.
* @return {@code true} if {@code this} is equal to {@code another} instance
*/
@Override
public boolean equals(Object another) {
if (this == another) return true;
return another instanceof ImmutableQueryOptions
&& equalTo((ImmutableQueryOptions) another);
}
private boolean equalTo(ImmutableQueryOptions another) {
return wait.equals(another.wait)
&& token.equals(another.token)
&& index.equals(another.index)
&& near.equals(another.near)
&& consistencyMode.equals(another.consistencyMode)
&& isBlocking == another.isBlocking
&& hasToken == another.hasToken;
}
/**
* Computes a hash code from attributes: {@code wait}, {@code token}, {@code index}, {@code near}, {@code consistencyMode}, {@code isBlocking}, {@code hasToken}.
* @return hashCode value
*/
@Override
public int hashCode() {
int h = 31;
h = h * 17 + wait.hashCode();
h = h * 17 + token.hashCode();
h = h * 17 + index.hashCode();
h = h * 17 + near.hashCode();
h = h * 17 + consistencyMode.hashCode();
h = h * 17 + Booleans.hashCode(isBlocking);
h = h * 17 + Booleans.hashCode(hasToken);
return h;
}
/**
* Prints the immutable value {@code QueryOptions...} with all non-generated
* and non-auxiliary attribute values.
* @return A string representation of the value
*/
@Override
public String toString() {
return MoreObjects.toStringHelper("QueryOptions")
.add("wait", wait)
.add("token", token)
.add("index", index)
.add("near", near)
.add("consistencyMode", consistencyMode)
.add("isBlocking", isBlocking)
.add("hasToken", hasToken)
.toString();
}
private static ImmutableQueryOptions validate(ImmutableQueryOptions instance) {
instance.validate();
return instance;
}
/**
* Creates an immutable copy of a {@link QueryOptions} value.
* Uses accessors to get values to initialize the new immutable instance.
* If an instance is already immutable, it is returned as is.
* @param instance The instance to copy
* @return A copied immutable QueryOptions instance
*/
public static ImmutableQueryOptions copyOf(QueryOptions instance) {
if (instance instanceof ImmutableQueryOptions) {
return (ImmutableQueryOptions) instance;
}
return ImmutableQueryOptions.builder()
.from(instance)
.build();
}
/**
* Creates a builder for {@link ImmutableQueryOptions ImmutableQueryOptions}.
* @return A new ImmutableQueryOptions builder
*/
public static ImmutableQueryOptions.Builder builder() {
return new ImmutableQueryOptions.Builder();
}
/**
* Builds instances of type {@link ImmutableQueryOptions ImmutableQueryOptions}.
* Initialize attributes and then invoke the {@link #build()} method to create an
* immutable instance.
* {@code Builder} is not thread-safe and generally should not be stored in a field or collection,
* but instead used immediately to create instances.
*/
public static final class Builder {
private Optional wait = Optional.absent();
private Optional token = Optional.absent();
private Optional index = Optional.absent();
private Optional near = Optional.absent();
private ConsistencyMode consistencyMode;
private Builder() {
}
/**
* Fill a builder with attribute values from the provided {@code QueryOptions} instance.
* Regular attribute values will be replaced with those from the given instance.
* Absent optional values will not replace present values.
* @param instance The instance from which to copy values
* @return {@code this} builder for use in a chained invocation
*/
public final Builder from(QueryOptions instance) {
Preconditions.checkNotNull(instance, "instance");
Optional waitOptional = instance.getWait();
if (waitOptional.isPresent()) {
wait(waitOptional);
}
Optional tokenOptional = instance.getToken();
if (tokenOptional.isPresent()) {
token(tokenOptional);
}
Optional indexOptional = instance.getIndex();
if (indexOptional.isPresent()) {
index(indexOptional);
}
Optional nearOptional = instance.getNear();
if (nearOptional.isPresent()) {
near(nearOptional);
}
consistencyMode(instance.getConsistencyMode());
return this;
}
/**
* Initializes the optional value {@link QueryOptions#getWait() wait} to wait.
* @param wait The value for wait
* @return {@code this} builder for chained invocation
*/
public final Builder wait(String wait) {
this.wait = Optional.of(wait);
return this;
}
/**
* Initializes the optional value {@link QueryOptions#getWait() wait} to wait.
* @param wait The value for wait
* @return {@code this} builder for use in a chained invocation
*/
public final Builder wait(Optional wait) {
this.wait = Preconditions.checkNotNull(wait, "wait");
return this;
}
/**
* Initializes the optional value {@link QueryOptions#getToken() token} to token.
* @param token The value for token
* @return {@code this} builder for chained invocation
*/
public final Builder token(String token) {
this.token = Optional.of(token);
return this;
}
/**
* Initializes the optional value {@link QueryOptions#getToken() token} to token.
* @param token The value for token
* @return {@code this} builder for use in a chained invocation
*/
public final Builder token(Optional token) {
this.token = Preconditions.checkNotNull(token, "token");
return this;
}
/**
* Initializes the optional value {@link QueryOptions#getIndex() index} to index.
* @param index The value for index
* @return {@code this} builder for chained invocation
*/
public final Builder index(BigInteger index) {
this.index = Optional.of(index);
return this;
}
/**
* Initializes the optional value {@link QueryOptions#getIndex() index} to index.
* @param index The value for index
* @return {@code this} builder for use in a chained invocation
*/
public final Builder index(Optional index) {
this.index = Preconditions.checkNotNull(index, "index");
return this;
}
/**
* Initializes the optional value {@link QueryOptions#getNear() near} to near.
* @param near The value for near
* @return {@code this} builder for chained invocation
*/
public final Builder near(String near) {
this.near = Optional.of(near);
return this;
}
/**
* Initializes the optional value {@link QueryOptions#getNear() near} to near.
* @param near The value for near
* @return {@code this} builder for use in a chained invocation
*/
public final Builder near(Optional near) {
this.near = Preconditions.checkNotNull(near, "near");
return this;
}
/**
* Initializes the value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute.
* If not set, this attribute will have a default value as returned by the initializer of {@link QueryOptions#getConsistencyMode() consistencyMode}.
* @param consistencyMode The value for consistencyMode
* @return {@code this} builder for use in a chained invocation
*/
public final Builder consistencyMode(ConsistencyMode consistencyMode) {
this.consistencyMode = Preconditions.checkNotNull(consistencyMode, "consistencyMode");
return this;
}
/**
* Builds a new {@link ImmutableQueryOptions ImmutableQueryOptions}.
* @return An immutable instance of QueryOptions
* @throws java.lang.IllegalStateException if any required attributes are missing
*/
public ImmutableQueryOptions build() throws IllegalStateException {
return ImmutableQueryOptions.validate(new ImmutableQueryOptions(this));
}
}
}