From commits-return-49186-archive-asf-public=cust-asf.ponee.io@cxf.apache.org Fri May 11 04:00:37 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 2F63518063A for ; Fri, 11 May 2018 04:00:36 +0200 (CEST) Received: (qmail 91825 invoked by uid 500); 11 May 2018 02:00:35 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 91814 invoked by uid 99); 11 May 2018 02:00:35 -0000 Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 11 May 2018 02:00:35 +0000 Received: by gitbox.apache.org (ASF Mail Server at gitbox.apache.org, from userid 33) id 74A2C888B7; Fri, 11 May 2018 02:00:34 +0000 (UTC) Date: Fri, 11 May 2018 02:00:34 +0000 To: "commits@cxf.apache.org" Subject: [cxf] branch 3.1.x-fixes updated: [CXF-7716] Reduce StringBuilders and other performance changes. (#407) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Message-ID: <152600403438.27003.10029819158288265440@gitbox.apache.org> From: reta@apache.org X-Git-Host: gitbox.apache.org X-Git-Repo: cxf X-Git-Refname: refs/heads/3.1.x-fixes X-Git-Reftype: branch X-Git-Oldrev: efd9e916b3bf6b5efe537f07c15f78d41d65edf1 X-Git-Newrev: 9573d3d33d9e0f72d28e495fc8e068a42d3da9ec X-Git-Rev: 9573d3d33d9e0f72d28e495fc8e068a42d3da9ec X-Git-NotificationType: ref_changed_plus_diff X-Git-Multimail-Version: 1.5.dev Auto-Submitted: auto-generated This is an automated email from the ASF dual-hosted git repository. reta pushed a commit to branch 3.1.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git The following commit(s) were added to refs/heads/3.1.x-fixes by this push: new 9573d3d [CXF-7716] Reduce StringBuilders and other performance changes. (#407) 9573d3d is described below commit 9573d3d33d9e0f72d28e495fc8e068a42d3da9ec Author: Adam Anderson <31078699+WhiteCat22@users.noreply.github.com> AuthorDate: Thu May 10 16:59:18 2018 -0500 [CXF-7716] Reduce StringBuilders and other performance changes. (#407) --- .../lifecycle/PerRequestResourceProvider.java | 12 +++- .../org/apache/cxf/jaxrs/model/URITemplate.java | 32 +++++++-- .../apache/cxf/jaxrs/provider/ProviderFactory.java | 13 +--- .../cxf/jaxrs/utils/AccumulatingIntersector.java | 74 ++++++++++++++++++++ .../java/org/apache/cxf/jaxrs/utils/HttpUtils.java | 48 +++++++------ .../org/apache/cxf/jaxrs/utils/JAXRSUtils.java | 79 +++++++++------------- .../cxf/jaxrs/utils/MimeTypesIntersector.java | 26 +++++++ .../jaxrs/utils/NonAccumulatingIntersector.java | 36 ++++++++++ .../org/apache/cxf/jaxrs/utils/ResourceUtils.java | 17 ++++- 9 files changed, 253 insertions(+), 84 deletions(-) diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java index a617206..bdbfadb 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java @@ -19,9 +19,11 @@ package org.apache.cxf.jaxrs.lifecycle; +import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Type; import java.util.Collections; import java.util.Map; @@ -45,13 +47,19 @@ public class PerRequestResourceProvider implements ResourceProvider { private Constructor c; private Method postConstructMethod; private Method preDestroyMethod; - + private final Class[] params; + private final Annotation[][] anns; + private final Type[] genericTypes; + public PerRequestResourceProvider(Class clazz) { c = ResourceUtils.findResourceConstructor(clazz, true); if (c == null) { throw new RuntimeException("Resource class " + clazz + " has no valid constructor"); } + params = c.getParameterTypes(); + anns = c.getParameterAnnotations(); + genericTypes = c.getGenericParameterTypes(); postConstructMethod = ResourceUtils.findPostConstructMethod(clazz); preDestroyMethod = ResourceUtils.findPreDestroyMethod(clazz); } @@ -75,7 +83,7 @@ public class PerRequestResourceProvider implements ResourceProvider { (ProviderInfo)m.getExchange().getEndpoint().get(Application.class.getName()); Map, Object> mapValues = CastUtils.cast(application == null ? null : Collections.singletonMap(Application.class, application.getProvider())); - Object[] values = ResourceUtils.createConstructorArguments(c, m, true, mapValues); + Object[] values = ResourceUtils.createConstructorArguments(c, m, true, mapValues, params, anns, genericTypes); try { Object instance = values.length > 0 ? c.newInstance(values) : c.newInstance(new Object[]{}); InjectionUtils.invokeLifeCycleMethod(instance, postConstructMethod); diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java index e64e7c3..7803b94 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java @@ -130,10 +130,34 @@ public final class URITemplate { private static String escapeCharacters(String expression) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < expression.length(); i++) { - char ch = expression.charAt(i); - sb.append(isReservedCharacter(ch) ? "\\" + ch : ch); + int length = expression.length(); + int i = 0; + char ch = ' '; + for (; i < length; ++i) { + ch = expression.charAt(i); + if (isReservedCharacter(ch)) { + break; + } + } + + if (i == length) { + return expression; + } + + // Allows for up to 8 escaped characters before we start creating more + // StringBuilders. 8 is an arbitrary limit, but it seems to be + // sufficient in most cases. + StringBuilder sb = new StringBuilder(length + 8); + sb.append(expression, 0, i); + sb.append('\\'); + sb.append(ch); + ++i; + for (; i < length; ++i) { + ch = expression.charAt(i); + if (isReservedCharacter(ch)) { + sb.append('\\'); + } + sb.append(ch); } return sb.toString(); } diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java index 830fd52..dd99638 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java @@ -222,7 +222,7 @@ public abstract class ProviderFactory { if (argCls != null && argCls.isAssignableFrom(contextCls)) { List mTypes = JAXRSUtils.getProduceTypes( cr.getProvider().getClass().getAnnotation(Produces.class)); - if (JAXRSUtils.intersectMimeTypes(mTypes, type).size() > 0) { + if (JAXRSUtils.doMimeTypesIntersect(mTypes, type)) { injectContextValues(cr, m); candidates.add((ContextResolver)cr.getProvider()); } @@ -731,11 +731,8 @@ public abstract class ProviderFactory { MediaType mediaType) { MessageBodyReader ep = pi.getProvider(); List supportedMediaTypes = JAXRSUtils.getProviderConsumeTypes(ep); - - List availableMimeTypes = - JAXRSUtils.intersectMimeTypes(Collections.singletonList(mediaType), supportedMediaTypes, false); - return availableMimeTypes.size() != 0; + return JAXRSUtils.doMimeTypesIntersect(Collections.singletonList(mediaType), supportedMediaTypes); } private boolean isReadable(ProviderInfo> pi, @@ -755,12 +752,8 @@ public abstract class ProviderFactory { MediaType mediaType) { MessageBodyWriter ep = pi.getProvider(); List supportedMediaTypes = JAXRSUtils.getProviderProduceTypes(ep); - - List availableMimeTypes = - JAXRSUtils.intersectMimeTypes(Collections.singletonList(mediaType), - supportedMediaTypes, false); - return availableMimeTypes.size() != 0; + return JAXRSUtils.doMimeTypesIntersect(Collections.singletonList(mediaType), supportedMediaTypes); } private boolean isWriteable(ProviderInfo> pi, diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AccumulatingIntersector.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AccumulatingIntersector.java new file mode 100644 index 0000000..3d2537f --- /dev/null +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AccumulatingIntersector.java @@ -0,0 +1,74 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.cxf.jaxrs.utils; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +import javax.ws.rs.core.MediaType; + +public class AccumulatingIntersector implements MimeTypesIntersector { + private static final String MEDIA_TYPE_DISTANCE_PARAM = "d"; + private final Set supportedMimeTypeList = new LinkedHashSet(); + private final boolean addRequiredParamsIfPossible; + private final boolean addDistanceParameter; + + AccumulatingIntersector(boolean addRequiredParamsIfPossible, boolean addDistanceParameter) { + this.addRequiredParamsIfPossible = addRequiredParamsIfPossible; + this.addDistanceParameter = addDistanceParameter; + } + + @Override + public boolean intersect(MediaType requiredType, MediaType userType) { + boolean requiredTypeWildcard = requiredType.getType().equals(MediaType.MEDIA_TYPE_WILDCARD); + boolean requiredSubTypeWildcard = requiredType.getSubtype().contains(MediaType.MEDIA_TYPE_WILDCARD); + + String type = requiredTypeWildcard ? userType.getType() : requiredType.getType(); + String subtype = requiredSubTypeWildcard ? userType.getSubtype() : requiredType.getSubtype(); + + Map parameters = userType.getParameters(); + if (addRequiredParamsIfPossible) { + parameters = new LinkedHashMap(parameters); + for (Map.Entry entry : requiredType.getParameters().entrySet()) { + if (!parameters.containsKey(entry.getKey())) { + parameters.put(entry.getKey(), entry.getValue()); + } + } + } + if (addDistanceParameter) { + int distance = 0; + if (requiredTypeWildcard) { + distance++; + } + if (requiredSubTypeWildcard) { + distance++; + } + parameters.put(MEDIA_TYPE_DISTANCE_PARAM, Integer.toString(distance)); + } + getSupportedMimeTypeList().add(new MediaType(type, subtype, parameters)); + return true; + } + + public Set getSupportedMimeTypeList() { + return supportedMimeTypeList; + } +} diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java index e58a0dc..1a130a6 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java @@ -116,25 +116,29 @@ public final class HttpUtils { } private static String componentEncode(String reservedChars, String value) { - - StringBuilder buffer = new StringBuilder(); - StringBuilder bufferToEncode = new StringBuilder(); - - for (int i = 0; i < value.length(); i++) { + StringBuilder buffer = null; + int length = value.length(); + int startingIndex = 0; + for (int i = 0; i < length; i++) { char currentChar = value.charAt(i); if (reservedChars.indexOf(currentChar) != -1) { - if (bufferToEncode.length() > 0) { - buffer.append(urlEncode(bufferToEncode.toString())); - bufferToEncode.setLength(0); - } + if (buffer == null) { + buffer = new StringBuilder(length + 8); + } + // If it is going to be an empty string nothing to encode. + if (i != startingIndex) { + buffer.append(urlEncode(value.substring(startingIndex, i))); + } buffer.append(currentChar); - } else { - bufferToEncode.append(currentChar); + startingIndex = i + 1; } } - - if (bufferToEncode.length() > 0) { - buffer.append(urlEncode(bufferToEncode.toString())); + + if (buffer == null) { + return urlEncode(value); + } + if (startingIndex < length) { + buffer.append(urlEncode(value.substring(startingIndex, length))); } return buffer.toString(); @@ -186,15 +190,21 @@ public final class HttpUtils { return encoded; } Matcher m = ENCODE_PATTERN.matcher(encoded); - StringBuilder sb = new StringBuilder(); + + if (!m.find()) { + return query ? HttpUtils.queryEncode(encoded) : HttpUtils.pathEncode(encoded); + } + + int length = encoded.length(); + StringBuilder sb = new StringBuilder(length + 8); int i = 0; - while (m.find()) { + do { String before = encoded.substring(i, m.start()); sb.append(query ? HttpUtils.queryEncode(before) : HttpUtils.pathEncode(before)); sb.append(m.group()); - i = m.end(); - } - String tail = encoded.substring(i, encoded.length()); + i = m.end(); + } while (m.find()); + String tail = encoded.substring(i, length); sb.append(query ? HttpUtils.queryEncode(tail) : HttpUtils.pathEncode(tail)); return sb.toString(); } diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java index 2c316a1..4149e80 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java @@ -35,7 +35,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -1424,22 +1423,19 @@ public final class JAXRSUtils { public static boolean matchConsumeTypes(MediaType requestContentType, OperationResourceInfo ori) { - - return !intersectMimeTypes(ori.getConsumeTypes(), requestContentType).isEmpty(); + return doMimeTypesIntersect(ori.getConsumeTypes(), requestContentType); } public static boolean matchProduceTypes(MediaType acceptContentType, OperationResourceInfo ori) { - - return !intersectMimeTypes(ori.getProduceTypes(), acceptContentType).isEmpty(); + return doMimeTypesIntersect(ori.getProduceTypes(), acceptContentType); } public static boolean matchMimeTypes(MediaType requestContentType, MediaType acceptContentType, OperationResourceInfo ori) { - - return intersectMimeTypes(ori.getConsumeTypes(), requestContentType).size() != 0 - && intersectMimeTypes(ori.getProduceTypes(), acceptContentType).size() != 0; + return doMimeTypesIntersect(ori.getConsumeTypes(), requestContentType) + && doMimeTypesIntersect(ori.getProduceTypes(), acceptContentType); } public static List parseMediaTypes(String types) { @@ -1463,7 +1459,17 @@ public final class JAXRSUtils { return acceptValues; } - + + public static boolean doMimeTypesIntersect(List mimeTypesA, MediaType mimeTypeB) { + return doMimeTypesIntersect(mimeTypesA, Collections.singletonList(mimeTypeB)); + } + + public static boolean doMimeTypesIntersect(List requiredMediaTypes, List userMediaTypes) { + final NonAccumulatingIntersector intersector = new NonAccumulatingIntersector(); + intersectMimeTypes(requiredMediaTypes, userMediaTypes, intersector); + return intersector.doIntersect(); + } + /** * intersect two mime types * @@ -1476,11 +1482,19 @@ public final class JAXRSUtils { boolean addRequiredParamsIfPossible) { return intersectMimeTypes(requiredMediaTypes, userMediaTypes, addRequiredParamsIfPossible, false); } - public static List intersectMimeTypes(List requiredMediaTypes, + + public static List intersectMimeTypes(List requiredMediaTypes, List userMediaTypes, boolean addRequiredParamsIfPossible, boolean addDistanceParameter) { - Set supportedMimeTypeList = new LinkedHashSet(); + final AccumulatingIntersector intersector = new AccumulatingIntersector(addRequiredParamsIfPossible, + addDistanceParameter); + intersectMimeTypes(requiredMediaTypes, userMediaTypes, intersector); + return new ArrayList<>(intersector.getSupportedMimeTypeList()); + } + + private static void intersectMimeTypes(List requiredMediaTypes, List userMediaTypes, + MimeTypesIntersector intersector) { for (MediaType requiredType : requiredMediaTypes) { for (MediaType userType : userMediaTypes) { @@ -1489,12 +1503,10 @@ public final class JAXRSUtils { boolean parametersMatched = true; for (Map.Entry entry : userType.getParameters().entrySet()) { String value = requiredType.getParameters().get(entry.getKey()); - if (value != null && entry.getValue() != null - && !(stripDoubleQuotesIfNeeded(value).equals( - stripDoubleQuotesIfNeeded(entry.getValue())))) { - - if (HTTP_CHARSET_PARAM.equals(entry.getKey()) - && value.equalsIgnoreCase(entry.getValue())) { + if (value != null && entry.getValue() != null && !(stripDoubleQuotesIfNeeded(value) + .equals(stripDoubleQuotesIfNeeded(entry.getValue())))) { + + if (HTTP_CHARSET_PARAM.equals(entry.getKey()) && value.equalsIgnoreCase(entry.getValue())) { continue; } parametersMatched = false; @@ -1504,40 +1516,15 @@ public final class JAXRSUtils { if (!parametersMatched) { continue; } - boolean requiredTypeWildcard = requiredType.getType().equals(MediaType.MEDIA_TYPE_WILDCARD); - boolean requiredSubTypeWildcard = requiredType.getSubtype().contains(MediaType.MEDIA_TYPE_WILDCARD); - - String type = requiredTypeWildcard ? userType.getType() : requiredType.getType(); - String subtype = requiredSubTypeWildcard ? userType.getSubtype() : requiredType.getSubtype(); - - Map parameters = userType.getParameters(); - if (addRequiredParamsIfPossible) { - parameters = new LinkedHashMap(parameters); - for (Map.Entry entry : requiredType.getParameters().entrySet()) { - if (!parameters.containsKey(entry.getKey())) { - parameters.put(entry.getKey(), entry.getValue()); - } - } - } - if (addDistanceParameter) { - int distance = 0; - if (requiredTypeWildcard) { - distance++; - } - if (requiredSubTypeWildcard) { - distance++; - } - parameters.put(MEDIA_TYPE_DISTANCE_PARAM, Integer.toString(distance)); + + if (!intersector.intersect(requiredType, userType)) { + return; } - supportedMimeTypeList.add(new MediaType(type, subtype, parameters)); } } } - - return new ArrayList(supportedMimeTypeList); - } - + private static String stripDoubleQuotesIfNeeded(String value) { if (value != null && value.startsWith("\"") && value.endsWith("\"") && value.length() > 1) { diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/MimeTypesIntersector.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/MimeTypesIntersector.java new file mode 100644 index 0000000..3dd3e47 --- /dev/null +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/MimeTypesIntersector.java @@ -0,0 +1,26 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.cxf.jaxrs.utils; + +import javax.ws.rs.core.MediaType; + +public interface MimeTypesIntersector { + boolean intersect(MediaType requiredType, MediaType userType); +} diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/NonAccumulatingIntersector.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/NonAccumulatingIntersector.java new file mode 100644 index 0000000..7f6661e --- /dev/null +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/NonAccumulatingIntersector.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.cxf.jaxrs.utils; + +import javax.ws.rs.core.MediaType; + +public class NonAccumulatingIntersector implements MimeTypesIntersector { + private boolean doIntersect; + + @Override + public boolean intersect(MediaType requiredType, MediaType userType) { + doIntersect = true; + return false; + } + + public boolean doIntersect() { + return doIntersect; + } +} diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java index 6a980e3..34695f1 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java @@ -784,12 +784,23 @@ public final class ResourceUtils { Message m, boolean perRequest, Map, Object> contextValues) { - if (m == null) { - m = new MessageImpl(); - } Class[] params = c.getParameterTypes(); Annotation[][] anns = c.getParameterAnnotations(); Type[] genericTypes = c.getGenericParameterTypes(); + return createConstructorArguments(c, m, perRequest, contextValues, params, anns, genericTypes); + } + + public static Object[] createConstructorArguments(Constructor c, + Message m, + boolean perRequest, + Map, + Object> contextValues, + Class[] params, + Annotation[][] anns, + Type[] genericTypes) { + if (m == null) { + m = new MessageImpl(); + } @SuppressWarnings("unchecked") MultivaluedMap templateValues = (MultivaluedMap)m.get(URITemplate.TEMPLATE_PARAMETERS); -- To stop receiving notification emails like this one, please contact reta@apache.org.