Skip to content

Commit 3e62527

Browse files
committed
Allow @priority for ExceptionMapper
Centralized working with @priority value. Signed-off-by: jansupol <jan.supol@oracle.com>
1 parent 5616760 commit 3e62527

File tree

11 files changed

+128
-77
lines changed

11 files changed

+128
-77
lines changed

core-common/src/main/java/org/glassfish/jersey/JerseyPriorities.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2014, 2019 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2014, 2023 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -16,6 +16,7 @@
1616

1717
package org.glassfish.jersey;
1818

19+
import javax.annotation.Priority;
1920
import javax.ws.rs.Priorities;
2021

2122
/**
@@ -36,4 +37,15 @@ private JerseyPriorities() {
3637
* processing after the components with {@code Priorities.ENTITY_CODER} are processed.
3738
*/
3839
public static final int POST_ENTITY_CODER = Priorities.ENTITY_CODER + 100;
40+
41+
/**
42+
* Return the value of priority annotation on a given class, if exists. Return the default value if not present.
43+
* @param prioritized the provider class that potentially has a priority.
44+
* @param _default the default priority if not {@link @Priority) present
45+
* @return the value of Priority annotation if present or the default otherwise.
46+
*/
47+
public static int getPriority(Class<?> prioritized, int _default) {
48+
final Priority priority = prioritized.getAnnotation(Priority.class);
49+
return priority != null ? priority.value() : _default;
50+
}
3951
}

core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -28,9 +28,11 @@
2828
import java.util.logging.Level;
2929
import java.util.logging.Logger;
3030

31+
import javax.ws.rs.Priorities;
3132
import javax.ws.rs.ProcessingException;
3233
import javax.ws.rs.ext.ExceptionMapper;
3334

35+
import org.glassfish.jersey.JerseyPriorities;
3436
import org.glassfish.jersey.internal.inject.Bindings;
3537
import org.glassfish.jersey.internal.inject.InjectionManager;
3638
import org.glassfish.jersey.internal.inject.InstanceBinding;
@@ -111,19 +113,18 @@ public <T extends Throwable> ExceptionMapper<T> find(final Class<T> type) {
111113
private <T extends Throwable> ExceptionMapper<T> find(final Class<T> type, final T exceptionInstance) {
112114
ExceptionMapper<T> mapper = null;
113115
int minDistance = Integer.MAX_VALUE;
116+
int priority = Priorities.USER;
114117

115118
for (final ExceptionMapperType mapperType : exceptionMapperTypes.get()) {
116119
final int d = distance(type, mapperType.exceptionType);
117120
if (d >= 0 && d <= minDistance) {
118121
final ExceptionMapper<T> candidate = mapperType.mapper.getInstance();
122+
final int p = mapperType.mapper.getRank() > 0 ? mapperType.mapper.getRank() : Priorities.USER;
119123

120-
if (isPreferredCandidate(exceptionInstance, candidate, d == minDistance)) {
124+
if (isPreferredCandidate(exceptionInstance, candidate, d == minDistance && p >= priority)) {
121125
mapper = candidate;
122126
minDistance = d;
123-
if (d == 0) {
124-
// slight optimization: if the distance is 0, it is already the best case, so we can exit
125-
return mapper;
126-
}
127+
priority = p;
127128
}
128129
}
129130
}

core-common/src/main/java/org/glassfish/jersey/internal/config/ExternalPropertiesConfigurationFactory.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -16,11 +16,11 @@
1616

1717
package org.glassfish.jersey.internal.config;
1818

19+
import org.glassfish.jersey.JerseyPriorities;
1920
import org.glassfish.jersey.internal.ServiceFinder;
2021
import org.glassfish.jersey.spi.ExternalConfigurationModel;
2122
import org.glassfish.jersey.spi.ExternalConfigurationProvider;
2223

23-
import javax.annotation.Priority;
2424
import javax.ws.rs.Priorities;
2525
import javax.ws.rs.core.Configurable;
2626
import java.util.ArrayList;
@@ -152,19 +152,8 @@ private static class ConfigComparator implements Comparator<ExternalConfiguratio
152152

153153
@Override
154154
public int compare(ExternalConfigurationProvider config1, ExternalConfigurationProvider config2) {
155-
156-
boolean config1PriorityPresent = config1.getClass().isAnnotationPresent(Priority.class);
157-
boolean config2PriorityPresent = config2.getClass().isAnnotationPresent(Priority.class);
158-
159-
int priority1 = Priorities.USER;
160-
int priority2 = Priorities.USER;
161-
162-
if (config1PriorityPresent) {
163-
priority1 = config1.getClass().getAnnotation(Priority.class).value();
164-
}
165-
if (config2PriorityPresent) {
166-
priority2 = config2.getClass().getAnnotation(Priority.class).value();
167-
}
155+
int priority1 = JerseyPriorities.getPriority(config1.getClass(), Priorities.USER);
156+
int priority2 = JerseyPriorities.getPriority(config2.getClass(), Priorities.USER);
168157

169158
if (priority1 == priority2) {
170159
return config1.getClass().getName().compareTo(config2.getClass().getName());

core-common/src/main/java/org/glassfish/jersey/internal/inject/Providers.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -42,6 +42,7 @@
4242

4343
import javax.annotation.Priority;
4444

45+
import org.glassfish.jersey.JerseyPriorities;
4546
import org.glassfish.jersey.internal.LocalizationMessages;
4647
import org.glassfish.jersey.model.ContractProvider;
4748
import org.glassfish.jersey.model.internal.RankedComparator;
@@ -357,13 +358,7 @@ private static <T> T holder2service(ServiceHolder<T> holder) {
357358
}
358359

359360
private static int getPriority(Class<?> serviceClass) {
360-
Priority annotation = serviceClass.getAnnotation(Priority.class);
361-
if (annotation != null) {
362-
return annotation.value();
363-
}
364-
365-
// default priority
366-
return Priorities.USER;
361+
return JerseyPriorities.getPriority(serviceClass, /* default priority */ Priorities.USER);
367362
}
368363

369364
private static <T> Class<T> getImplementationClass(Class<T> contract, ServiceHolder<T> serviceHolder) {

core-common/src/main/java/org/glassfish/jersey/message/internal/TracingLogger.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
import javax.ws.rs.core.MultivaluedMap;
2424
import javax.ws.rs.core.Response;
2525

26-
import javax.annotation.Priority;
27-
26+
import org.glassfish.jersey.JerseyPriorities;
2827
import org.glassfish.jersey.internal.PropertiesDelegate;
2928

3029
/**
@@ -315,8 +314,9 @@ private static String formatInstance(final Object instance) {
315314
} else {
316315
textSB.append('[');
317316
formatInstance(instance, textSB);
318-
if (instance.getClass().isAnnotationPresent(Priority.class)) {
319-
textSB.append(" #").append(instance.getClass().getAnnotation(Priority.class).value());
317+
final int priority = JerseyPriorities.getPriority(instance.getClass(), -1);
318+
if (priority != -1) {
319+
textSB.append(" #").append(priority);
320320
}
321321
if (instance instanceof WebApplicationException) {
322322
formatResponse(((WebApplicationException) instance).getResponse(), textSB);

core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -42,9 +42,8 @@
4242
import javax.ws.rs.core.Feature;
4343
import javax.ws.rs.core.FeatureContext;
4444

45-
import javax.annotation.Priority;
46-
4745
import org.glassfish.jersey.ExtendedConfig;
46+
import org.glassfish.jersey.JerseyPriorities;
4847
import org.glassfish.jersey.internal.LocalizationMessages;
4948
import org.glassfish.jersey.internal.ServiceFinder;
5049
import org.glassfish.jersey.internal.inject.Binder;
@@ -131,12 +130,7 @@ private static int priority(Class<? extends Feature> featureClass, int priority)
131130
if (priority != ContractProvider.NO_PRIORITY) {
132131
return priority;
133132
}
134-
final Priority priorityAnnotation = featureClass.getAnnotation(Priority.class);
135-
if (priorityAnnotation != null) {
136-
return priorityAnnotation.value();
137-
} else {
138-
return Priorities.USER;
139-
}
133+
return JerseyPriorities.getPriority(featureClass, Priorities.USER);
140134
}
141135

142136
/**
@@ -592,10 +586,8 @@ public void configureAutoDiscoverableProviders(final InjectionManager injectionM
592586
// Check whether meta providers have been initialized for a config this config has been loaded from.
593587
if (!disableMetaProviderConfiguration) {
594588
final Set<AutoDiscoverable> providers = new TreeSet<>((o1, o2) -> {
595-
final int p1 = o1.getClass().isAnnotationPresent(Priority.class)
596-
? o1.getClass().getAnnotation(Priority.class).value() : Priorities.USER;
597-
final int p2 = o2.getClass().isAnnotationPresent(Priority.class)
598-
? o2.getClass().getAnnotation(Priority.class).value() : Priorities.USER;
589+
final int p1 = JerseyPriorities.getPriority(o1.getClass(), Priorities.USER);
590+
final int p2 = JerseyPriorities.getPriority(o2.getClass(), Priorities.USER);
599591

600592
return (p1 < p2 || p1 == p2) ? -1 : 1;
601593
});

core-common/src/main/java/org/glassfish/jersey/model/internal/RankedProvider.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -21,8 +21,7 @@
2121

2222
import javax.ws.rs.Priorities;
2323

24-
import javax.annotation.Priority;
25-
24+
import org.glassfish.jersey.JerseyPriorities;
2625
import org.glassfish.jersey.model.ContractProvider;
2726

2827
/**
@@ -84,11 +83,7 @@ private int computeRank(final T provider, final int rank) {
8483
clazz = clazz.getSuperclass();
8584
}
8685

87-
if (clazz.isAnnotationPresent(Priority.class)) {
88-
return clazz.getAnnotation(Priority.class).value();
89-
} else {
90-
return Priorities.USER;
91-
}
86+
return JerseyPriorities.getPriority(clazz, Priorities.USER);
9287
}
9388
}
9489

ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, 2021 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2019, 2021 Payara Foundation and/or its affiliates. All rights reserved.
44
*
55
* This program and the accompanying materials are made available under the
@@ -39,7 +39,6 @@
3939
import java.util.logging.Level;
4040
import java.util.logging.Logger;
4141

42-
import javax.annotation.Priority;
4342
import javax.net.ssl.HostnameVerifier;
4443
import javax.net.ssl.SSLContext;
4544
import javax.ws.rs.Priorities;
@@ -61,6 +60,7 @@
6160
import org.eclipse.microprofile.rest.client.ext.QueryParamStyle;
6261
import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;
6362
import org.eclipse.microprofile.rest.client.spi.RestClientListener;
63+
import org.glassfish.jersey.JerseyPriorities;
6464
import org.glassfish.jersey.client.ClientConfig;
6565
import org.glassfish.jersey.client.ClientProperties;
6666
import org.glassfish.jersey.client.Initializable;
@@ -299,8 +299,7 @@ private int getProviderPriority(Class<?> restClientInterface, Class<?> providerC
299299
} else if (providerPriorityJersey instanceof Integer) {
300300
return (int) providerPriorityJersey;
301301
}
302-
Priority priority = providerClass.getAnnotation(Priority.class);
303-
return priority == null ? -1 : priority.value();
302+
return JerseyPriorities.getPriority(providerClass, -1);
304303
}
305304

306305
@Override
@@ -524,9 +523,7 @@ public AsyncInvocationInterceptor newInterceptor() {
524523

525524
Integer getPriority() {
526525
if (priority == null) {
527-
priority = Optional.ofNullable(factory.getClass().getAnnotation(Priority.class))
528-
.map(Priority::value)
529-
.orElse(Priorities.USER);
526+
priority = JerseyPriorities.getPriority(factory.getClass(), Priorities.USER);
530527
}
531528
return priority;
532529
}

incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,7 +23,6 @@
2323
import java.util.HashSet;
2424
import java.util.Set;
2525

26-
import javax.annotation.Priority;
2726
import javax.enterprise.context.Dependent;
2827
import javax.enterprise.context.RequestScoped;
2928
import javax.enterprise.context.spi.CreationalContext;
@@ -36,6 +35,7 @@
3635
import javax.inject.Singleton;
3736
import javax.ws.rs.RuntimeType;
3837

38+
import org.glassfish.jersey.JerseyPriorities;
3939
import org.glassfish.jersey.internal.inject.Binding;
4040
import org.glassfish.jersey.internal.inject.PerLookup;
4141
import org.glassfish.jersey.internal.inject.PerThread;
@@ -161,15 +161,13 @@ public int getRank() {
161161
return binding.getRank();
162162
}
163163

164+
int _default = 1;
164165
Class<T> type = binding.getImplementationType();
165166
if (type != null) {
166-
Priority priority = type.getAnnotation(Priority.class);
167-
if (priority != null) {
168-
return priority.value();
169-
}
167+
return JerseyPriorities.getPriority(type, _default);
170168
}
171169

172-
return 1;
170+
return _default;
173171
}
174172

175173
@Override

inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,7 +22,6 @@
2222
import java.util.HashSet;
2323
import java.util.Set;
2424

25-
import javax.annotation.Priority;
2625
import javax.enterprise.context.Dependent;
2726
import javax.enterprise.context.RequestScoped;
2827
import javax.enterprise.context.spi.CreationalContext;
@@ -34,6 +33,7 @@
3433
import javax.enterprise.util.AnnotationLiteral;
3534
import javax.inject.Singleton;
3635

36+
import org.glassfish.jersey.JerseyPriorities;
3737
import org.glassfish.jersey.internal.inject.Binding;
3838
import org.glassfish.jersey.internal.inject.PerLookup;
3939
import org.glassfish.jersey.internal.inject.PerThread;
@@ -151,16 +151,14 @@ public int getRank() {
151151
if (binding.getRank() != null) {
152152
return binding.getRank();
153153
}
154+
int _default = 1;
154155

155156
Class<T> type = binding.getImplementationType();
156157
if (type != null) {
157-
Priority priority = type.getAnnotation(Priority.class);
158-
if (priority != null) {
159-
return priority.value();
160-
}
158+
return JerseyPriorities.getPriority(type, _default);
161159
}
162160

163-
return 1;
161+
return _default;
164162
}
165163

166164
@Override

0 commit comments

Comments
 (0)