Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow for setting connector provider via properties #5345

Merged
merged 2 commits into from
Jun 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/*
* Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/

package org.glassfish.jersey.helidon.connector;

import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.HttpUrlConnectorProvider;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import java.io.IOException;

// The Helidon jar has META-INF set
// Test of override
class MetaInfOverrideTest extends JerseyTest {

@Path("/origin")
public static class UserAgentServer {
@GET
public String get(@Context HttpHeaders headers) {
return headers.getHeaderString(HttpHeaders.USER_AGENT);
}
}

@Override
protected Application configure() {
return new ResourceConfig(UserAgentServer.class);
}

@Test
void defaultMetaInfTest() {
try (Response r = target("origin").request().get()) {
Assertions.assertEquals(200, r.getStatus());
Assertions.assertTrue(r.readEntity(String.class).contains("Helidon"));
}
}

@Test
void overrideMetaInfTest() {
ClientConfig config = new ClientConfig();
config.connectorProvider(new HttpUrlConnectorProvider());
try (Response r = ClientBuilder.newClient(config).target(target("origin").getUri()).request().get()) {
Assertions.assertEquals(200, r.getStatus());
r.bufferEntity();
System.out.println(r.readEntity(String.class));
Assertions.assertTrue(r.readEntity(String.class).contains("HttpUrlConnection"));
}
}

@Test
void overrideMetaInfByOtherConfigPropertyTest() {
ClientConfig config = new ClientConfig();
config.property(ClientProperties.CONNECTOR_PROVIDER, "org.glassfish.jersey.client.HttpUrlConnectorProvider");
try (Response r = ClientBuilder.newClient(config).target(target("origin").getUri()).request().get()) {
Assertions.assertEquals(200, r.getStatus());
r.bufferEntity();
System.out.println(r.readEntity(String.class));
Assertions.assertTrue(r.readEntity(String.class).contains("HttpUrlConnection"));
}
}

@Test
void overrideMetaInfByThePropertyTest() {
try (Response r = ClientBuilder.newBuilder()
.property(ClientProperties.CONNECTOR_PROVIDER, "org.glassfish.jersey.client.HttpUrlConnectorProvider")
.build()
.target(target("origin").getUri()).request().get()) {
Assertions.assertEquals(200, r.getStatus());
r.bufferEntity();
System.out.println(r.readEntity(String.class));
Assertions.assertTrue(r.readEntity(String.class).contains("HttpUrlConnection"));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand All @@ -24,6 +24,8 @@
import org.glassfish.jersey.internal.util.PropertiesHelper;
import org.glassfish.jersey.internal.util.PropertyAlias;

import javax.ws.rs.client.ClientBuilder;

/**
* Jersey client implementation configuration properties.
*
Expand Down Expand Up @@ -444,7 +446,7 @@ public final class ClientProperties {
EXPECT_100_CONTINUE_THRESHOLD_SIZE = "jersey.config.client.request.expect.100.continue.threshold.size";

/**
* Default threshold size (64kb) after which which Expect:100-Continue header would be applied before
* Default threshold size (64kb) after which Expect:100-Continue header would be applied before
* the main request.
*
* @since 2.32
Expand All @@ -463,6 +465,22 @@ public final class ClientProperties {
*/
public static final String QUERY_PARAM_STYLE = "jersey.config.client.uri.query.param.style";

/**
* Sets the {@link org.glassfish.jersey.client.spi.ConnectorProvider} class. Overrides the value from META-INF/services.
*
* <p>
* The value MUST be an instance of {@code String}.
* </p>
* <p>
* The property is recognized by {@link ClientBuilder}.
* </p>
* <p>
* The name of the configuration property is <tt>{@value}</tt>.
* </p>
* @since 2.40
*/
public static final String CONNECTOR_PROVIDER = "jersey.config.client.connector.provider";

private ClientProperties() {
// prevents instantiation
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand All @@ -16,6 +16,7 @@

package org.glassfish.jersey.client;

import java.security.AccessController;
import java.security.KeyStore;
import java.util.Collections;
import java.util.LinkedList;
Expand All @@ -32,9 +33,13 @@
import javax.net.ssl.SSLContext;

import org.glassfish.jersey.SslConfigurator;
import org.glassfish.jersey.client.innate.inject.NonInjectionManager;
import org.glassfish.jersey.client.internal.LocalizationMessages;
import org.glassfish.jersey.client.spi.ClientBuilderListener;
import org.glassfish.jersey.client.spi.ConnectorProvider;
import org.glassfish.jersey.internal.ServiceFinder;
import org.glassfish.jersey.internal.config.ExternalPropertiesConfigurationFactory;
import org.glassfish.jersey.internal.util.ReflectionHelper;
import org.glassfish.jersey.internal.util.collection.UnsafeValue;
import org.glassfish.jersey.internal.util.collection.Values;
import org.glassfish.jersey.model.internal.RankedComparator;
Expand Down Expand Up @@ -186,6 +191,9 @@ public ClientBuilder readTimeout(long timeout, TimeUnit unit) {

@Override
public JerseyClient build() {
ExternalPropertiesConfigurationFactory.configure(this.config);
setConnectorFromProperties();

if (sslContext != null) {
return new JerseyClient(config, sslContext, hostnameVerifier, null);
} else if (sslConfigurator != null) {
Expand All @@ -204,6 +212,20 @@ public SSLContext get() {
}
}

private void setConnectorFromProperties() {
final Object connectorClass = config.getProperty(ClientProperties.CONNECTOR_PROVIDER);
if (connectorClass != null) {
if (String.class.isInstance(connectorClass)) {
Class<? extends ConnectorProvider> clazz
= AccessController.doPrivileged(ReflectionHelper.classForNamePA((String) connectorClass));
final ConnectorProvider connectorProvider = new NonInjectionManager().justCreate(clazz);
config.connectorProvider(connectorProvider);
} else {
throw new IllegalArgumentException();
}
}
}

@Override
public ClientConfig getConfiguration() {
return config;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -418,10 +418,31 @@ public <T> T create(Class<T> createMe) {
}

ClassBindings<T> classBindings = classBindings(createMe);
return classBindings.create();
return classBindings.create(true);
}

private <T> T justCreate(Class<T> createMe) {
@Override
public <T> T createAndInitialize(Class<T> createMe) {
checkShutdown();

if (InjectionManager.class.equals(createMe)) {
return (T) this;
}
if (RequestScope.class.equals(createMe)) {
if (!isRequestScope) {
isRequestScope = true;
return (T) new NonInjectionRequestScope();
} else {
throw new IllegalStateException(LocalizationMessages.NONINJECT_REQUESTSCOPE_CREATED());
}
}

ClassBindings<T> classBindings = classBindings(createMe);
T t = classBindings.create(false);
return t != null ? t : justCreate(createMe);
}

public <T> T justCreate(Class<T> createMe) {
T result = null;
try {
Constructor<T> mostArgConstructor = findConstructor(createMe);
Expand Down Expand Up @@ -492,11 +513,6 @@ private void checkUnique(List<?> list) {
}
}

@Override
public <T> T createAndInitialize(Class<T> createMe) {
return justCreate(createMe);
}

@Override
public void inject(Object injectMe) {
Method postConstruct = getAnnotatedMethod(injectMe, PostConstruct.class);
Expand Down Expand Up @@ -750,7 +766,7 @@ private X _create(SupplierInstanceBinding<X> binding) {
return t;
}

X create() {
X create(boolean throwWhenNoBinding) {
_checkUnique();
if (!instanceBindings.isEmpty()) {
return _getInstance(instanceBindings.get(0));
Expand All @@ -762,15 +778,19 @@ X create() {
return _create(supplierClassBindings.get(0));
}

throw new IllegalStateException(LocalizationMessages.NONINJECT_NO_BINDING(type));
if (throwWhenNoBinding) {
throw new IllegalStateException(LocalizationMessages.NONINJECT_NO_BINDING(type));
} else {
return null;
}
}

protected X getInstance() {
X instance = instances.getInstance(type, instancesQualifiers);
if (instance != null) {
return instance;
}
return create();
return create(true);
}

List<X> allInstances() {
Expand Down Expand Up @@ -931,7 +951,7 @@ protected T _createAndStore(ClassBinding<T> binding) {

@SuppressWarnings("unchecked")
@Override
T create() {
T create(boolean throwWhenNoBinding) {
if (ParameterizedType.class.isInstance(type)) {
ParameterizedType pt = (ParameterizedType) type;
if (Provider.class.equals(pt.getRawType())) {
Expand All @@ -955,7 +975,7 @@ public Object get() {
};
}
}
return super.create();
return super.create(throwWhenNoBinding);
}
}

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
org.glassfish.jersey.logging.LoggingFeatureAutoDiscoverable
org.glassfish.jersey.internal.config.ExternalPropertiesAutoDiscoverable
org.glassfish.jersey.logging.LoggingFeatureAutoDiscoverable
Loading
Loading