Skip to content
This repository was archived by the owner on May 28, 2018. It is now read-only.

Commit 7660c77

Browse files
author
Petr Bouda
committed
Removing an injection from Param-Value Providers and Injection Resolvers.
Change-Id: I8ba11148c66fd07d9c74718025c49d0cc26fb306
1 parent a2ee446 commit 7660c77

File tree

49 files changed

+1382
-671
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1382
-671
lines changed

core-client/src/main/java/org/glassfish/jersey/client/ClientBinder.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@
5656
import org.glassfish.jersey.internal.JerseyErrorService;
5757
import org.glassfish.jersey.internal.PropertiesDelegate;
5858
import org.glassfish.jersey.internal.ServiceFinderBinder;
59-
import org.glassfish.jersey.internal.inject.ContextInjectionResolver;
60-
import org.glassfish.jersey.internal.inject.JerseyClassAnalyzer;
6159
import org.glassfish.jersey.internal.inject.ReferencingFactory;
6260
import org.glassfish.jersey.internal.inject.SupplierFactory;
6361
import org.glassfish.jersey.internal.spi.AutoDiscoverable;
@@ -116,8 +114,6 @@ public PropertiesDelegate provide() {
116114
protected void configure() {
117115
install(new RequestScope.Binder(), // must go first as it registers the request scope instance.
118116
new JerseyErrorService.Binder(),
119-
new ContextInjectionResolver.Binder(),
120-
new JerseyClassAnalyzer.Binder(),
121117
new MessagingBinders.MessageBodyProviders(clientRuntimeProperties, RuntimeType.CLIENT),
122118
new MessagingBinders.HeaderDelegateProviders(),
123119
new MessageBodyFactory.Binder(),

core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,7 @@ public State onChange(final State state) {
113113
private volatile ConnectorProvider connectorProvider;
114114

115115

116-
private final LazyValue<ClientRuntime> runtime = Values.lazy(new Value<ClientRuntime>() {
117-
@Override
118-
public ClientRuntime get() {
119-
return initRuntime();
120-
}
121-
});
116+
private final LazyValue<ClientRuntime> runtime = Values.lazy((Value<ClientRuntime>) this::initRuntime);
122117

123118
/**
124119
* Configuration state change strategy.
Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
33
*
4-
* Copyright (c) 2012-2017 Oracle and/or its affiliates. All rights reserved.
4+
* Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
55
*
66
* The contents of this file are subject to the terms of either the GNU
77
* General Public License Version 2 only ("GPL") or the Common Development
@@ -38,7 +38,7 @@
3838
* holder.
3939
*/
4040

41-
package org.glassfish.jersey.internal.inject;
41+
package org.glassfish.jersey.hk2;
4242

4343
import java.lang.reflect.Field;
4444
import java.lang.reflect.Type;
@@ -52,12 +52,15 @@
5252
import javax.inject.Inject;
5353
import javax.inject.Singleton;
5454

55+
import org.glassfish.jersey.internal.inject.ForeignRequestScopeBridge;
56+
import org.glassfish.jersey.internal.inject.SupplierFactory;
5557
import org.glassfish.jersey.internal.util.ReflectionHelper;
5658
import org.glassfish.jersey.internal.util.collection.LazyValue;
5759
import org.glassfish.jersey.internal.util.collection.Value;
5860
import org.glassfish.jersey.internal.util.collection.Values;
5961
import org.glassfish.jersey.process.internal.RequestScoped;
6062
import org.glassfish.jersey.spi.inject.AbstractBinder;
63+
import org.glassfish.jersey.spi.inject.ContextInjectionResolver;
6164

6265
import org.glassfish.hk2.api.ActiveDescriptor;
6366
import org.glassfish.hk2.api.Factory;
@@ -78,7 +81,7 @@
7881
* @author Jakub Podlesak (jakub.podlesak at oracle.com)
7982
*/
8083
@Singleton
81-
public class ContextInjectionResolver implements InjectionResolver<Context> {
84+
public class ContextInjectionResolverImpl implements InjectionResolver<Context>, ContextInjectionResolver {
8285

8386
/**
8487
* Context injection resolver binder.
@@ -87,9 +90,11 @@ public static final class Binder extends AbstractBinder {
8790

8891
@Override
8992
protected void configure() {
90-
// @Context
91-
bind(ContextInjectionResolver.class).to(new GenericType<InjectionResolver<Context>>() {
92-
}).in(Singleton.class);
93+
bind(ContextInjectionResolverImpl.class)
94+
.to(new GenericType<InjectionResolver<Context>>() {})
95+
.to(new GenericType<org.glassfish.jersey.spi.inject.InjectionResolver<Context>>() {})
96+
.to(ContextInjectionResolver.class)
97+
.in(Singleton.class);
9398
}
9499
}
95100

@@ -131,6 +136,31 @@ public Object resolve(Injectee injectee, ServiceHandle<?> root) {
131136
return null;
132137
}
133138

139+
/**
140+
* Jersey Injection Resolver method that just populate HK2 injectee object and delegates the processing to HK2 Injection
141+
* Resolver.
142+
*
143+
* @param injectee The injection point this value is being injected into
144+
* @return result of the injection processing.
145+
*/
146+
@Override
147+
public Object resolve(org.glassfish.jersey.spi.inject.Injectee injectee) {
148+
InjecteeImpl hk2injectee = new InjecteeImpl() {
149+
@Override
150+
public Class<?> getInjecteeClass() {
151+
return injectee.getInjecteeClass();
152+
}
153+
};
154+
hk2injectee.setRequiredType(injectee.getRequiredType());
155+
hk2injectee.setRequiredQualifiers(injectee.getRequiredQualifiers());
156+
if (injectee.getInjecteeDescriptor() != null) {
157+
hk2injectee.setInjecteeDescriptor((ActiveDescriptor<?>) injectee.getInjecteeDescriptor().get());
158+
}
159+
160+
// Delegate the call to HK2 Resolver, Service Handle is not need in the delegated processing.
161+
return resolve(hk2injectee, null);
162+
}
163+
134164
private Factory asFactory(final ServiceHandle handle) {
135165
return new SupplierFactory() {
136166
@Override
@@ -145,19 +175,13 @@ private Injectee getFactoryInjectee(final Injectee injectee, final Type required
145175
}
146176

147177
private static class RequiredTypeOverridingInjectee extends InjecteeImpl {
148-
149-
private static final long serialVersionUID = -3740895548611880187L;
150-
151178
private RequiredTypeOverridingInjectee(final Injectee injectee, final Type requiredType) {
152179
super(injectee);
153180
setRequiredType(requiredType);
154181
}
155182
}
156183

157184
private static class DescriptorOverridingInjectee extends InjecteeImpl {
158-
159-
private static final long serialVersionUID = -3740895548611880189L;
160-
161185
private DescriptorOverridingInjectee(final Injectee injectee, final ActiveDescriptor descriptor) {
162186
super(injectee);
163187
setInjecteeDescriptor(descriptor);
@@ -174,9 +198,13 @@ public boolean isMethodParameterIndicator() {
174198
return false;
175199
}
176200

201+
@Override
202+
public Class<Context> getAnnotation() {
203+
return Context.class;
204+
}
177205

178206
private final Cache<Injectee, Injectee> foreignRequestScopedInjecteeCache =
179-
new Cache<Injectee, Injectee>(new Computable<Injectee, Injectee>() {
207+
new Cache<>(new Computable<Injectee, Injectee>() {
180208
@Override
181209
public Injectee compute(Injectee injectee) {
182210
if (injectee.getParent() != null) {
@@ -200,12 +228,8 @@ public Injectee compute(Injectee injectee) {
200228
}
201229
});
202230

203-
LazyValue<Set<Class<?>>> foreignRequestScopedComponents = Values.lazy(new Value<Set<Class<?>>>() {
204-
@Override
205-
public Set<Class<?>> get() {
206-
return getForeignRequestScopedComponents();
207-
}
208-
});
231+
private LazyValue<Set<Class<?>>> foreignRequestScopedComponents = Values.lazy(
232+
(Value<Set<Class<?>>>) this::getForeignRequestScopedComponents);
209233

210234
private Set<Class<?>> getForeignRequestScopedComponents() {
211235
final List<ForeignRequestScopeBridge> scopeBridges = serviceLocator.getAllServices(ForeignRequestScopeBridge.class);

core-common/src/main/java/org/glassfish/jersey/hk2/HK2InstanceManager.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,16 @@
5151
import org.glassfish.jersey.spi.ServiceHolder;
5252
import org.glassfish.jersey.spi.ServiceHolderImpl;
5353
import org.glassfish.jersey.spi.inject.Binder;
54+
import org.glassfish.jersey.spi.inject.ClassBeanDescriptor;
5455
import org.glassfish.jersey.spi.inject.CompositeBinder;
5556
import org.glassfish.jersey.spi.inject.Descriptor;
5657
import org.glassfish.jersey.spi.inject.Descriptors;
58+
import org.glassfish.jersey.spi.inject.ForeignDescriptor;
59+
import org.glassfish.jersey.spi.inject.ForeignDescriptorImpl;
60+
import org.glassfish.jersey.spi.inject.InstanceBeanDescriptor;
5761
import org.glassfish.jersey.spi.inject.InstanceManager;
5862

63+
import org.glassfish.hk2.api.ActiveDescriptor;
5964
import org.glassfish.hk2.api.ServiceLocator;
6065
import org.glassfish.hk2.api.ServiceLocatorFactory;
6166
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
@@ -136,16 +141,20 @@ public ServiceLocator getServiceLocator() {
136141
}
137142

138143
@Override
139-
public void initialize(String name, InstanceManager parent, String defaultClassAnalyzer, Binder... binders) {
144+
public void initialize(String name, InstanceManager parent, Binder... binders) {
140145
this.locator = createLocator(name, parent);
146+
ServiceLocatorUtilities.bind(locator, new JerseyClassAnalyzer.Binder(locator));
141147

142148
// First service the current BeanManager to be able to inject itself into other services.
143149
Hk2Helper.bind(locator, Descriptors.service(this).to(InstanceManager.class));
144150

151+
// Add support for Context annotation.
152+
Hk2Helper.bind(locator, new ContextInjectionResolverImpl.Binder());
153+
145154
// Compose together the initialization binders and bind them as a whole.
146155
Hk2Helper.bind(locator, CompositeBinder.wrap(binders));
147156

148-
this.locator.setDefaultClassAnalyzerName(defaultClassAnalyzer);
157+
this.locator.setDefaultClassAnalyzerName(JerseyClassAnalyzer.NAME);
149158

150159
// clear HK2 caches
151160
ServiceLocatorRuntimeBean serviceLocatorRuntimeBean = locator.getService(ServiceLocatorRuntimeBean.class);
@@ -223,6 +232,32 @@ public <T> T getInstance(Type clazz) {
223232
return locator.getService(clazz);
224233
}
225234

235+
@Override
236+
public Object getInstance(ForeignDescriptor foreignDescriptor) {
237+
return locator.getServiceHandle((ActiveDescriptor<?>) foreignDescriptor.get()).getService();
238+
}
239+
240+
@Override
241+
public ForeignDescriptor createForeignDescriptor(Descriptor descriptor) {
242+
ForeignDescriptor foreignDescriptor = createAndTranslateForeignDescriptor(descriptor);
243+
ActiveDescriptor<Object> activeDescriptor = ServiceLocatorUtilities
244+
.addOneDescriptor(locator, (org.glassfish.hk2.api.Descriptor) foreignDescriptor.get(), false);
245+
return new ForeignDescriptorImpl(activeDescriptor);
246+
}
247+
248+
private ForeignDescriptor createAndTranslateForeignDescriptor(Descriptor descriptor) {
249+
ActiveDescriptor<?> activeDescriptor;
250+
if (ClassBeanDescriptor.class.isAssignableFrom(descriptor.getClass())) {
251+
activeDescriptor = Hk2Helper.translateToActiveDescriptor((ClassBeanDescriptor<?>) descriptor);
252+
} else if (InstanceBeanDescriptor.class.isAssignableFrom(descriptor.getClass())) {
253+
activeDescriptor = Hk2Helper.translateToActiveDescriptor((InstanceBeanDescriptor<?>) descriptor);
254+
} else {
255+
throw new RuntimeException(LocalizationMessages.UNKNOWN_DESCRIPTOR_TYPE(descriptor.getClass().getSimpleName()));
256+
}
257+
258+
return new ForeignDescriptorImpl(activeDescriptor);
259+
}
260+
226261
@Override
227262
public <T> T getInstance(Class<T> clazz) {
228263
return locator.getService(clazz);

core-common/src/main/java/org/glassfish/jersey/hk2/Hk2Helper.java

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,23 @@
4242

4343
import java.lang.annotation.Annotation;
4444
import java.lang.reflect.Type;
45+
import java.util.Set;
4546

4647
import org.glassfish.jersey.internal.LocalizationMessages;
4748
import org.glassfish.jersey.spi.inject.AliasDescriptor;
4849
import org.glassfish.jersey.spi.inject.ClassBeanDescriptor;
4950
import org.glassfish.jersey.spi.inject.ClassFactoryDescriptor;
5051
import org.glassfish.jersey.spi.inject.Descriptor;
52+
import org.glassfish.jersey.spi.inject.Descriptors;
53+
import org.glassfish.jersey.spi.inject.InjectionResolverDescriptor;
5154
import org.glassfish.jersey.spi.inject.InstanceBeanDescriptor;
5255
import org.glassfish.jersey.spi.inject.InstanceFactoryDescriptor;
5356

5457
import org.glassfish.hk2.api.ActiveDescriptor;
5558
import org.glassfish.hk2.api.DynamicConfiguration;
5659
import org.glassfish.hk2.api.DynamicConfigurationService;
5760
import org.glassfish.hk2.api.Factory;
61+
import org.glassfish.hk2.api.InjectionResolver;
5862
import org.glassfish.hk2.api.ServiceLocator;
5963
import org.glassfish.hk2.utilities.AbstractActiveDescriptor;
6064
import org.glassfish.hk2.utilities.ActiveDescriptorBuilder;
@@ -132,10 +136,17 @@ private static void bindDescriptor(ServiceLocator locator, Descriptor<?, ?> desc
132136
*/
133137
private static void bindDescriptor(ServiceLocator locator, DynamicConfiguration dc, Descriptor<?, ?> descriptor) {
134138
if (ClassBeanDescriptor.class.isAssignableFrom(descriptor.getClass())) {
135-
bindClassDescriptor(locator, dc, (ClassBeanDescriptor<?>) descriptor);
139+
ActiveDescriptor<?> activeDescriptor = translateToActiveDescriptor((ClassBeanDescriptor<?>) descriptor);
140+
bindDescriptor(locator, dc, activeDescriptor, descriptor.getAliases());
136141

137142
} else if (InstanceBeanDescriptor.class.isAssignableFrom(descriptor.getClass())) {
138-
bindInstanceDescriptor(locator, dc, (InstanceBeanDescriptor<?>) descriptor);
143+
ActiveDescriptor<?> activeDescriptor = translateToActiveDescriptor((InstanceBeanDescriptor<?>) descriptor);
144+
bindDescriptor(locator, dc, activeDescriptor, descriptor.getAliases());
145+
146+
} else if (InjectionResolverDescriptor.class.isAssignableFrom(descriptor.getClass())) {
147+
InjectionResolverDescriptor resolverDescriptor = (InjectionResolverDescriptor) descriptor;
148+
bindDescriptor(locator, dc, wrapInjectionResolver(resolverDescriptor), descriptor.getAliases());
149+
bindDescriptor(locator, dc, translateToActiveDescriptor(resolverDescriptor), descriptor.getAliases());
139150

140151
} else if (ClassFactoryDescriptor.class.isAssignableFrom(descriptor.getClass())) {
141152
bindClassFactoryDescriptor(dc, (ClassFactoryDescriptor<?>) descriptor);
@@ -148,6 +159,13 @@ private static void bindDescriptor(ServiceLocator locator, DynamicConfiguration
148159
}
149160
}
150161

162+
@SuppressWarnings("unchecked")
163+
private static ActiveDescriptor<?> wrapInjectionResolver(InjectionResolverDescriptor resolverDescriptor) {
164+
InjectionResolverWrapper<?> wrappedResolver = new InjectionResolverWrapper<>(resolverDescriptor.getResolver());
165+
return translateToActiveDescriptor(Descriptors.service(wrappedResolver),
166+
new ParameterizedTypeImpl(InjectionResolver.class, resolverDescriptor.getResolver().getAnnotation()));
167+
}
168+
151169
/**
152170
* Binds a new instance {@link org.glassfish.hk2.api.FactoryDescriptors} using the information from the Jersey descriptor
153171
* {@link InstanceFactoryDescriptor}.
@@ -244,16 +262,7 @@ private static void bindClassFactoryDescriptor(DynamicConfiguration dc, ClassFac
244262
dc.bind(new FactoryDescriptorsImpl(factoryDescriptorBuilder.build(), descriptorBuilder.buildProvideMethod()));
245263
}
246264

247-
/**
248-
* Binds a new instance {@link Descriptor} using the information from the Jersey descriptor {@link ClassBeanDescriptor}.
249-
* <p>
250-
* Along with a new instance, the method is able to register aliases belonging to the new service.
251-
*
252-
* @param locator HK2 instance manager.
253-
* @param dc HK2 Dynamic configuration to bind the object.
254-
* @param desc Jersey descriptor as a holder of information about an injection point.
255-
*/
256-
private static void bindClassDescriptor(ServiceLocator locator, DynamicConfiguration dc, ClassBeanDescriptor<?> desc) {
265+
static ActiveDescriptor<?> translateToActiveDescriptor(ClassBeanDescriptor<?> desc) {
257266
ActiveDescriptorBuilder binding = BuilderHelper.activeLink(desc.getService())
258267
.named(desc.getName())
259268
.analyzeWith(desc.getAnalyzer());
@@ -286,23 +295,35 @@ private static void bindClassDescriptor(ServiceLocator locator, DynamicConfigura
286295
binding.asType(desc.getImplementationType());
287296
}
288297

289-
ActiveDescriptor<Object> activeDescriptor = dc.bind(binding.build());
290-
for (AliasDescriptor alias : desc.getAliases()) {
291-
dc.bind(createAlias(locator, activeDescriptor, alias));
292-
}
298+
return binding.build();
293299
}
294300

295301
/**
296302
* Binds a new instance {@link Descriptor} using the information from the Jersey descriptor {@link InstanceBeanDescriptor}.
297303
* <p>
298304
* Along with a new instance, the method is able to register aliases belonging to the new service.
299305
*
300-
* @param locator HK2 instance manager.
301-
* @param dc HK2 Dynamic configuration to bind the object.
302-
* @param desc Jersey descriptor as a holder of information about an injection point.
306+
* @param locator HK2 instance manager.
307+
* @param dc HK2 Dynamic configuration to bind the object.
308+
* @param activeDescriptor HK2 active descriptor.
309+
* @param aliases aliases belonging to the given descriptor.
303310
*/
304-
private static void bindInstanceDescriptor(ServiceLocator locator, DynamicConfiguration dc, InstanceBeanDescriptor<?> desc) {
305-
AbstractActiveDescriptor<?> binding = BuilderHelper.createConstantDescriptor(desc.getService());
311+
private static void bindDescriptor(ServiceLocator locator, DynamicConfiguration dc, ActiveDescriptor<?> activeDescriptor,
312+
Set<AliasDescriptor> aliases) {
313+
ActiveDescriptor<Object> boundDescriptor = dc.bind(activeDescriptor);
314+
for (AliasDescriptor alias : aliases) {
315+
dc.bind(createAlias(locator, boundDescriptor, alias));
316+
}
317+
}
318+
319+
static ActiveDescriptor<?> translateToActiveDescriptor(InstanceBeanDescriptor<?> desc, Type... contracts) {
320+
AbstractActiveDescriptor<?> binding;
321+
if (contracts.length == 0) {
322+
binding = BuilderHelper.createConstantDescriptor(desc.getService());
323+
} else {
324+
binding = BuilderHelper.createConstantDescriptor(desc.getService(), null, contracts);
325+
}
326+
306327
binding.setName(desc.getName());
307328
binding.setClassAnalysisName(desc.getAnalyzer());
308329

@@ -330,10 +351,14 @@ private static void bindInstanceDescriptor(ServiceLocator locator, DynamicConfig
330351
binding.setProxyForSameScope(desc.isProxiedForSameScope());
331352
}
332353

333-
ActiveDescriptor<Object> activeDescriptor = dc.bind(binding);
334-
for (AliasDescriptor alias : desc.getAliases()) {
335-
dc.bind(createAlias(locator, activeDescriptor, alias));
336-
}
354+
return binding;
355+
}
356+
357+
private static ActiveDescriptor<?> translateToActiveDescriptor(InjectionResolverDescriptor<?> desc) {
358+
ParameterizedTypeImpl parameterizedType = new ParameterizedTypeImpl(
359+
org.glassfish.jersey.spi.inject.InjectionResolver.class, desc.getResolver().getAnnotation());
360+
361+
return BuilderHelper.createConstantDescriptor(desc.getResolver(), null, parameterizedType);
337362
}
338363

339364
/**

0 commit comments

Comments
 (0)