Skip to content

Commit edf5464

Browse files
committed
Create a UriWrapper abstraction for the migration
1 parent 6a9b818 commit edf5464

File tree

7 files changed

+160
-17
lines changed

7 files changed

+160
-17
lines changed

core/src/main/java/io/grpc/internal/ManagedChannelImpl.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@
9494
import io.grpc.internal.ManagedChannelServiceConfig.ServiceConfigConvertedSelector;
9595
import io.grpc.internal.RetriableStream.ChannelBufferMeter;
9696
import io.grpc.internal.RetriableStream.Throttle;
97-
import java.net.URI;
9897
import java.util.ArrayList;
9998
import java.util.Collection;
10099
import java.util.Collections;
@@ -159,7 +158,7 @@ public Result selectConfig(PickSubchannelArgs args) {
159158
@Nullable
160159
private final String authorityOverride;
161160
private final NameResolverRegistry nameResolverRegistry;
162-
private final URI targetUri;
161+
private final UriWrapper targetUri;
163162
private final NameResolverProvider nameResolverProvider;
164163
private final NameResolver.Args nameResolverArgs;
165164
private final AutoConfiguredLoadBalancerFactory loadBalancerFactory;
@@ -546,7 +545,7 @@ ClientStream newSubstream(
546545
ManagedChannelImpl(
547546
ManagedChannelImplBuilder builder,
548547
ClientTransportFactory clientTransportFactory,
549-
URI targetUri,
548+
UriWrapper targetUri,
550549
NameResolverProvider nameResolverProvider,
551550
BackoffPolicy.Provider backoffPolicyProvider,
552551
ObjectPool<? extends Executor> balancerRpcExecutorPool,
@@ -677,9 +676,9 @@ public CallTracer create() {
677676

678677
@VisibleForTesting
679678
static NameResolver getNameResolver(
680-
URI targetUri, @Nullable final String overrideAuthority,
679+
UriWrapper targetUri, @Nullable final String overrideAuthority,
681680
NameResolverProvider provider, NameResolver.Args nameResolverArgs) {
682-
NameResolver resolver = provider.newNameResolver(targetUri, nameResolverArgs);
681+
NameResolver resolver = targetUri.newNameResolver(provider, nameResolverArgs);
683682
if (resolver == null) {
684683
throw new IllegalArgumentException("cannot create a NameResolver for " + targetUri);
685684
}

core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.common.base.Preconditions.checkArgument;
2020
import static com.google.common.base.Preconditions.checkNotNull;
21+
import static io.grpc.internal.UriWrapper.wrap;
2122

2223
import com.google.common.annotations.VisibleForTesting;
2324
import com.google.common.base.Preconditions;
@@ -814,10 +815,10 @@ int getDefaultPort() {
814815

815816
@VisibleForTesting
816817
static class ResolvedNameResolver {
817-
public final URI targetUri;
818+
public final UriWrapper targetUri;
818819
public final NameResolverProvider provider;
819820

820-
public ResolvedNameResolver(URI targetUri, NameResolverProvider provider) {
821+
public ResolvedNameResolver(UriWrapper targetUri, NameResolverProvider provider) {
821822
this.targetUri = checkNotNull(targetUri, "targetUri");
822823
this.provider = checkNotNull(provider, "provider");
823824
}
@@ -872,7 +873,7 @@ static ResolvedNameResolver getNameResolverProvider(
872873
}
873874
}
874875

875-
return new ResolvedNameResolver(targetUri, provider);
876+
return new ResolvedNameResolver(wrap(targetUri), provider);
876877
}
877878

878879
private static class DirectAddressNameResolverProvider extends NameResolverProvider {
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/*
2+
* Copyright 2025 The gRPC Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.grpc.internal;
18+
19+
import static com.google.common.base.Preconditions.checkNotNull;
20+
21+
import io.grpc.NameResolver;
22+
import io.grpc.Uri;
23+
import java.net.URI;
24+
import javax.annotation.Nullable;
25+
26+
/** Temporary wrapper for a URI-like object to ease the migration to io.grpc.Uri. */
27+
interface UriWrapper {
28+
29+
static UriWrapper wrap(URI uri) {
30+
return new JavaNetUriWrapper(uri);
31+
}
32+
33+
static UriWrapper wrap(Uri uri) {
34+
return new IoGrpcUriWrapper(uri);
35+
}
36+
37+
/** Uses the given factory and args to create a {@link NameResolver} for this URI. */
38+
NameResolver newNameResolver(NameResolver.Factory factory, NameResolver.Args args);
39+
40+
/** Returns the scheme component of this URI, e.g. "http", "mailto" or "dns". */
41+
String getScheme();
42+
43+
/**
44+
* Returns the authority component of this URI, e.g. "google.com", "127.0.0.1:8080", or null if
45+
* not present.
46+
*/
47+
@Nullable
48+
String getAuthority();
49+
50+
/** Wraps an instance of java.net.URI. */
51+
final class JavaNetUriWrapper implements UriWrapper {
52+
private final URI uri;
53+
54+
private JavaNetUriWrapper(URI uri) {
55+
this.uri = checkNotNull(uri);
56+
}
57+
58+
@Override
59+
public NameResolver newNameResolver(NameResolver.Factory factory, NameResolver.Args args) {
60+
return factory.newNameResolver(uri, args);
61+
}
62+
63+
@Override
64+
public String getScheme() {
65+
return uri.getScheme();
66+
}
67+
68+
@Override
69+
public String getAuthority() {
70+
return uri.getAuthority();
71+
}
72+
73+
@Override
74+
public String toString() {
75+
return uri.toString();
76+
}
77+
78+
@Override
79+
public boolean equals(Object other) {
80+
if (other == this) {
81+
return true;
82+
}
83+
if (!(other instanceof JavaNetUriWrapper)) {
84+
return false;
85+
}
86+
return uri.equals(((JavaNetUriWrapper) other).uri);
87+
}
88+
89+
@Override
90+
public int hashCode() {
91+
return uri.hashCode();
92+
}
93+
}
94+
95+
/** Wraps an instance of io.grpc.Uri. */
96+
final class IoGrpcUriWrapper implements UriWrapper {
97+
private final Uri uri;
98+
99+
private IoGrpcUriWrapper(Uri uri) {
100+
this.uri = checkNotNull(uri);
101+
}
102+
103+
@Override
104+
public NameResolver newNameResolver(NameResolver.Factory factory, NameResolver.Args args) {
105+
return factory.newNameResolver(uri, args);
106+
}
107+
108+
@Override
109+
public String getScheme() {
110+
return uri.getScheme();
111+
}
112+
113+
@Override
114+
public String getAuthority() {
115+
return uri.getAuthority();
116+
}
117+
118+
@Override
119+
public String toString() {
120+
return uri.toString();
121+
}
122+
123+
@Override
124+
public boolean equals(Object other) {
125+
if (other == this) {
126+
return true;
127+
}
128+
if (!(other instanceof IoGrpcUriWrapper)) {
129+
return false;
130+
}
131+
return uri.equals(((IoGrpcUriWrapper) other).uri);
132+
}
133+
134+
@Override
135+
public int hashCode() {
136+
return uri.hashCode();
137+
}
138+
}
139+
}

core/src/test/java/io/grpc/internal/ManagedChannelImplGetNameResolverTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.grpc.internal;
1818

1919
import static com.google.common.truth.Truth.assertThat;
20+
import static io.grpc.internal.UriWrapper.wrap;
2021
import static org.junit.Assert.fail;
2122

2223
import io.grpc.NameResolver;
@@ -125,7 +126,7 @@ private void testValidTarget(String target, String expectedUriString, URI expect
125126
ManagedChannelImplBuilder.getNameResolverProvider(
126127
target, nameResolverRegistry, Collections.singleton(InetSocketAddress.class));
127128
assertThat(resolved.provider).isInstanceOf(FakeNameResolverProvider.class);
128-
assertThat(resolved.targetUri).isEqualTo(expectedUri);
129+
assertThat(resolved.targetUri).isEqualTo(wrap(expectedUri));
129130
assertThat(resolved.targetUri.toString()).isEqualTo(expectedUriString);
130131
}
131132

core/src/test/java/io/grpc/internal/ManagedChannelImplIdlenessTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static com.google.common.truth.Truth.assertThat;
2020
import static io.grpc.ConnectivityState.READY;
2121
import static io.grpc.ConnectivityState.TRANSIENT_FAILURE;
22+
import static io.grpc.internal.UriWrapper.wrap;
2223
import static org.junit.Assert.assertEquals;
2324
import static org.junit.Assert.assertFalse;
2425
import static org.junit.Assert.assertNull;
@@ -185,7 +186,7 @@ public void setUp() {
185186
NameResolverProvider nameResolverProvider =
186187
builder.nameResolverRegistry.getProviderForScheme(targetUri.getScheme());
187188
channel = new ManagedChannelImpl(
188-
builder, mockTransportFactory, targetUri, nameResolverProvider,
189+
builder, mockTransportFactory, wrap(targetUri), nameResolverProvider,
189190
new FakeBackoffPolicyProvider(),
190191
oobExecutorPool, timer.getStopwatchSupplier(),
191192
Collections.<ClientInterceptor>emptyList(),

core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static io.grpc.EquivalentAddressGroup.ATTR_AUTHORITY_OVERRIDE;
2929
import static io.grpc.PickSubchannelArgsMatcher.eqPickSubchannelArgs;
3030
import static io.grpc.internal.ClientStreamListener.RpcProgress.PROCESSED;
31+
import static io.grpc.internal.UriWrapper.wrap;
3132
import static junit.framework.TestCase.assertNotSame;
3233
import static org.junit.Assert.assertEquals;
3334
import static org.junit.Assert.assertFalse;
@@ -319,7 +320,7 @@ private void createChannel(boolean nameResolutionExpectedToFail,
319320
NameResolverProvider nameResolverProvider =
320321
channelBuilder.nameResolverRegistry.getProviderForScheme(expectedUri.getScheme());
321322
channel = new ManagedChannelImpl(
322-
channelBuilder, mockTransportFactory, expectedUri, nameResolverProvider,
323+
channelBuilder, mockTransportFactory, wrap(expectedUri), nameResolverProvider,
323324
new FakeBackoffPolicyProvider(),
324325
balancerRpcExecutorPool, timer.getStopwatchSupplier(), Arrays.asList(interceptors),
325326
timer.getTimeProvider());
@@ -508,7 +509,7 @@ public void startCallBeforeNameResolution() throws Exception {
508509
when(mockTransportFactory.getSupportedSocketAddressTypes()).thenReturn(Collections.singleton(
509510
InetSocketAddress.class));
510511
channel = new ManagedChannelImpl(
511-
channelBuilder, mockTransportFactory, expectedUri, nameResolverFactory,
512+
channelBuilder, mockTransportFactory, wrap(expectedUri), nameResolverFactory,
512513
new FakeBackoffPolicyProvider(),
513514
balancerRpcExecutorPool, timer.getStopwatchSupplier(),
514515
Collections.<ClientInterceptor>emptyList(), timer.getTimeProvider());
@@ -573,7 +574,7 @@ public void newCallWithConfigSelector() {
573574
when(mockTransportFactory.getSupportedSocketAddressTypes()).thenReturn(Collections.singleton(
574575
InetSocketAddress.class));
575576
channel = new ManagedChannelImpl(
576-
channelBuilder, mockTransportFactory, expectedUri, nameResolverFactory,
577+
channelBuilder, mockTransportFactory, wrap(expectedUri), nameResolverFactory,
577578
new FakeBackoffPolicyProvider(),
578579
balancerRpcExecutorPool, timer.getStopwatchSupplier(),
579580
Collections.<ClientInterceptor>emptyList(), timer.getTimeProvider());
@@ -4830,11 +4831,11 @@ public void validAuthorityTarget_overrideAuthority() throws Exception {
48304831

48314832
URI targetUri = new URI("defaultscheme", "", "/foo.googleapis.com:8080", null);
48324833
NameResolver nameResolver = ManagedChannelImpl.getNameResolver(
4833-
targetUri, null, nameResolverProvider, NAMERESOLVER_ARGS);
4834+
wrap(targetUri), null, nameResolverProvider, NAMERESOLVER_ARGS);
48344835
assertThat(nameResolver.getServiceAuthority()).isEqualTo(serviceAuthority);
48354836

48364837
nameResolver = ManagedChannelImpl.getNameResolver(
4837-
targetUri, overrideAuthority, nameResolverProvider, NAMERESOLVER_ARGS);
4838+
wrap(targetUri), overrideAuthority, nameResolverProvider, NAMERESOLVER_ARGS);
48384839
assertThat(nameResolver.getServiceAuthority()).isEqualTo(overrideAuthority);
48394840
}
48404841

@@ -4863,7 +4864,7 @@ public String getDefaultScheme() {
48634864
};
48644865
try {
48654866
ManagedChannelImpl.getNameResolver(
4866-
URI.create("defaultscheme:///foo.gogoleapis.com:8080"),
4867+
wrap(URI.create("defaultscheme:///foo.gogoleapis.com:8080")),
48674868
null, nameResolverProvider, NAMERESOLVER_ARGS);
48684869
fail("Should fail");
48694870
} catch (IllegalArgumentException e) {

core/src/test/java/io/grpc/internal/ServiceConfigErrorHandlingTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static com.google.common.base.Preconditions.checkState;
2020
import static com.google.common.truth.Truth.assertThat;
2121
import static com.google.common.truth.Truth.assertWithMessage;
22+
import static io.grpc.internal.UriWrapper.wrap;
2223
import static org.junit.Assert.assertEquals;
2324
import static org.junit.Assert.assertTrue;
2425
import static org.mockito.AdditionalAnswers.delegatesTo;
@@ -168,7 +169,7 @@ private void createChannel(ClientInterceptor... interceptors) {
168169
new ManagedChannelImpl(
169170
channelBuilder,
170171
mockTransportFactory,
171-
expectedUri,
172+
wrap(expectedUri),
172173
nameResolverProvider,
173174
new FakeBackoffPolicyProvider(),
174175
balancerRpcExecutorPool,

0 commit comments

Comments
 (0)