-
Notifications
You must be signed in to change notification settings - Fork 357
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow for having CDI on pure Jersey Client without Jersey Server (#4695)
* Allow for having CDI on pure Jersey Client without Jersey Server jars dependencies Signed-off-by: jansupol <[email protected]>
- Loading branch information
Showing
30 changed files
with
1,362 additions
and
343 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
63 changes: 63 additions & 0 deletions
63
core-client/src/main/java/org/glassfish/jersey/client/ClientComponentConfigurator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/* | ||
* Copyright (c) 2021 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.client; | ||
|
||
import org.glassfish.jersey.internal.BootstrapBag; | ||
import org.glassfish.jersey.internal.BootstrapConfigurator; | ||
import org.glassfish.jersey.internal.ServiceConfigurationError; | ||
import org.glassfish.jersey.internal.ServiceFinder; | ||
import org.glassfish.jersey.internal.inject.InjectionManager; | ||
import org.glassfish.jersey.internal.util.collection.LazyValue; | ||
import org.glassfish.jersey.internal.util.collection.Value; | ||
import org.glassfish.jersey.internal.util.collection.Values; | ||
import org.glassfish.jersey.model.internal.RankedComparator; | ||
import org.glassfish.jersey.model.internal.RankedProvider; | ||
import org.glassfish.jersey.spi.ComponentProvider; | ||
|
||
import java.util.Collection; | ||
import java.util.Comparator; | ||
import java.util.stream.Collectors; | ||
import java.util.stream.StreamSupport; | ||
|
||
class ClientComponentConfigurator implements BootstrapConfigurator { | ||
private static final Comparator<RankedProvider<ComponentProvider>> RANKED_COMPARATOR = | ||
new RankedComparator<>(RankedComparator.Order.DESCENDING); | ||
|
||
@Override | ||
public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) { | ||
// There are situation in which ComponentProviders are not needed therefore their entire initialization is wrapped | ||
// into a lazy block. | ||
LazyValue<Collection<ComponentProvider>> componentProviders = | ||
Values.lazy((Value<Collection<ComponentProvider>>) () -> getRankedComponentProviders().stream() | ||
.map(RankedProvider::getProvider) | ||
.peek(provider -> provider.initialize(injectionManager)) | ||
.collect(Collectors.toList())); | ||
((ClientBootstrapBag) bootstrapBag).setComponentProviders(componentProviders); | ||
} | ||
|
||
@Override | ||
public void postInit(InjectionManager injectionManager, BootstrapBag bootstrapBag) { | ||
((ClientBootstrapBag) bootstrapBag).getComponentProviders().get().forEach(ComponentProvider::done); | ||
} | ||
|
||
private static Collection<RankedProvider<ComponentProvider>> getRankedComponentProviders() throws ServiceConfigurationError { | ||
return StreamSupport.stream(ServiceFinder.find(ComponentProvider.class).spliterator(), false) | ||
.map(RankedProvider::new) | ||
.sorted(RANKED_COMPARATOR) | ||
.collect(Collectors.toList()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
92 changes: 92 additions & 0 deletions
92
core-common/src/main/java/org/glassfish/jersey/spi/ComponentProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
/* | ||
* Copyright (c) 2021 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.spi; | ||
|
||
import java.util.Collections; | ||
import java.util.Set; | ||
|
||
import org.glassfish.jersey.internal.inject.InjectionManager; | ||
import org.glassfish.jersey.model.ContractProvider; | ||
|
||
/** | ||
* Component provider interface to allow custom management of 3rd party | ||
* components life-cycle and dependency injection. | ||
* <p /> | ||
* An implementation (a component-provider) identifies itself by placing a provider-configuration | ||
* file (if not already present), {@code org.glassfish.jersey.spi.ComponentProvider} | ||
* in the resource directory <tt>META-INF/services</tt>, and adding the fully | ||
* qualified service-provider-class of the implementation in the file. | ||
* | ||
* Jersey will not even try to inject component provider instances with Jersey artifacts. | ||
* The SPI providers should be designed so that no dependency injection is needed at the bind time phase. | ||
* @author Jakub Podlesak | ||
*/ | ||
public interface ComponentProvider { | ||
|
||
|
||
/** | ||
* Initializes the component provider with a reference to a injection manager | ||
* instance, which will get used in the application to manage individual components. | ||
* Providers should keep a reference to the injection manager for later use. | ||
* This method will be invoked prior to any bind method calls. | ||
* The injection manager parameter will not be fully initialized at the time of invocation | ||
* and should be used as a reference only. | ||
* | ||
* @param injectionManager an injection manager. | ||
*/ | ||
void initialize(final InjectionManager injectionManager); | ||
|
||
/** | ||
* Jersey will invoke this method before binding of each component class internally | ||
* during initialization of it's injection manager. | ||
* | ||
* If the component provider wants to bind the component class | ||
* itself, it must do so and return true. In that case, Jersey will not | ||
* bind the component and rely on the component provider in this regard. | ||
* | ||
* @param component a component (resource/provider) class. | ||
* @param providerContracts provider contracts implemented by given component. | ||
* @return true if the component class has been bound by the provider, false otherwise | ||
*/ | ||
boolean bind(final Class<?> component, Set<Class<?>> providerContracts); | ||
|
||
/** | ||
* Jersey will invoke this method before binding of each component class internally | ||
* during initialization of it's injection manager. | ||
* | ||
* If the component provider wants to bind the component class | ||
* itself, it must do so and return true. In that case, Jersey will not | ||
* bind the component and rely on the component provider in this regard. | ||
* | ||
* @param component a component (resource/provider) class. | ||
* @param contractProvider optional registered {@link ContractProvider} of the component. | ||
* @return true if the component class has been bound by the provider, false otherwise | ||
*/ | ||
default boolean bind(final Class<?> component, ContractProvider contractProvider) { | ||
final Set<Class<?>> contracts = contractProvider == null ? Collections.emptySet() : contractProvider.getContracts(); | ||
return bind(component, contracts); | ||
} | ||
|
||
/** | ||
* Jersey will invoke this method after all component classes have been bound. | ||
* | ||
* If the component provider wants to do some actions after it has seen all component classes | ||
* registered with the application, this is the right place for the corresponding code. | ||
*/ | ||
void done(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.