blob: 5a0a81fad8cb7c0cbe0116f4c6ccc058445e5e5b [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.v23.options;
import org.joda.time.Duration;
import javax.annotation.Nullable;
import io.v.v23.OptionDefs;
import io.v.v23.Options;
import io.v.v23.naming.MountEntry;
import io.v.v23.security.Authorizer;
import io.v.v23.security.VSecurity;
/**
* Strongly-typed alternative to {@link io.v.v23.Options} for RPCs, supporting more options. See
* also
* <a href="https://github.com/vanadium/go.v23/blob/master/options/options.go">v.io/v23/options</a>.
*/
public final class RpcOptions {
private static Authorizer migrateNameResolutionAuthorizer(final Options opts) {
if (opts.has(OptionDefs.SKIP_SERVER_ENDPOINT_AUTHORIZATION) &&
opts.get(OptionDefs.SKIP_SERVER_ENDPOINT_AUTHORIZATION, Boolean.class))
return VSecurity.newAllowEveryoneAuthorizer();
return !opts.has(OptionDefs.NAME_RESOLUTION_AUTHORIZER)
? null
: opts.get(OptionDefs.NAME_RESOLUTION_AUTHORIZER, Authorizer.class);
}
private static Authorizer migrateServerAuthorizer(final Options opts) {
if (opts.has(OptionDefs.SKIP_SERVER_ENDPOINT_AUTHORIZATION) &&
opts.get(OptionDefs.SKIP_SERVER_ENDPOINT_AUTHORIZATION, Boolean.class))
return VSecurity.newAllowEveryoneAuthorizer();
return !opts.has(OptionDefs.SERVER_AUTHORIZER)
? null
: opts.get(OptionDefs.SERVER_AUTHORIZER, Authorizer.class);
}
/**
* @deprecated For migration purposes only; call overloads taking {@code RpcOptions} directly.
*/
@Nullable public static RpcOptions migrateOptions(@Nullable final Options legacy) {
return legacy == null ? null : new RpcOptions()
.nameResolutionAuthorizer(migrateNameResolutionAuthorizer(legacy))
.serverAuthorizer(migrateServerAuthorizer(legacy));
}
private Authorizer nameResolutionAuthorizer, serverAuthorizer;
private MountEntry preresolved;
private boolean noRetry;
private Duration connectionTimeout, channelTimeout;
public RpcOptions nameResolutionAuthorizer(final Authorizer nameResolutionAuthorizer) {
this.nameResolutionAuthorizer = nameResolutionAuthorizer;
return this;
}
public RpcOptions serverAuthorizer(final Authorizer serverAuthorizer) {
this.serverAuthorizer = serverAuthorizer;
return this;
}
public RpcOptions preresolved(final MountEntry preresolved) {
this.preresolved = preresolved;
return this;
}
public RpcOptions noRetry(final boolean noRetry) {
this.noRetry = noRetry;
return this;
}
public RpcOptions connectionTimeout(final Duration connectionTimeout) {
this.connectionTimeout = connectionTimeout;
return this;
}
public RpcOptions channelTimeout(final Duration channelTimeout) {
this.channelTimeout = channelTimeout;
return this;
}
public Authorizer nameResolutionAuthorizer() {
return this.nameResolutionAuthorizer;
}
public Authorizer serverAuthorizer() {
return this.serverAuthorizer;
}
public MountEntry preresolved() {
return this.preresolved;
}
public boolean noRetry() {
return this.noRetry;
}
public Duration connectionTimeout() {
return this.connectionTimeout;
}
public Duration channelTimeout() {
return this.channelTimeout;
}
public RpcOptions skipServerEndpointAuthorization() {
nameResolutionAuthorizer = serverAuthorizer = VSecurity.newAllowEveryoneAuthorizer();
return this;
}
}