You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bu...@apache.org on 2012/12/04 17:48:10 UTC
svn commit: r840751 - in /websites/production/cxf/content:
cache/docs.pageCache docs/jax-rs-basics.html
Author: buildbot
Date: Tue Dec 4 16:48:10 2012
New Revision: 840751
Log:
Production update by buildbot for cxf
Modified:
websites/production/cxf/content/cache/docs.pageCache
websites/production/cxf/content/docs/jax-rs-basics.html
Modified: websites/production/cxf/content/cache/docs.pageCache
==============================================================================
Binary files - no diff available.
Modified: websites/production/cxf/content/docs/jax-rs-basics.html
==============================================================================
--- websites/production/cxf/content/docs/jax-rs-basics.html (original)
+++ websites/production/cxf/content/docs/jax-rs-basics.html Tue Dec 4 16:48:10 2012
@@ -728,6 +728,22 @@ A custom ResourceComparator can be used
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
+<span class="code-keyword">import</span> java.io.UnsupportedEncodingException;
+<span class="code-keyword">import</span> java.net.URLDecoder;
+<span class="code-keyword">import</span> java.util.HashSet;
+<span class="code-keyword">import</span> java.util.List;
+<span class="code-keyword">import</span> java.util.Set;
+
+<span class="code-keyword">import</span> javax.ws.rs.core.MultivaluedMap;
+
+<span class="code-keyword">import</span> org.apache.cxf.jaxrs.ext.ResourceComparator;
+<span class="code-keyword">import</span> org.apache.cxf.jaxrs.model.ClassResourceInfo;
+<span class="code-keyword">import</span> org.apache.cxf.jaxrs.model.OperationResourceInfo;
+<span class="code-keyword">import</span> org.apache.cxf.jaxrs.model.OperationResourceInfoComparator;
+<span class="code-keyword">import</span> org.apache.cxf.jaxrs.model.Parameter;
+<span class="code-keyword">import</span> org.apache.cxf.jaxrs.util.JAXRSUtils;
+<span class="code-keyword">import</span> org.apache.cxf.message.Message;
+
<span class="code-keyword">public</span> class QueryResourceInfoComperator <span class="code-keyword">extends</span> OperationResourceInfoComparator <span class="code-keyword">implements</span>
ResourceComparator {
@@ -749,12 +765,8 @@ A custom ResourceComparator can be used
<span class="code-keyword">if</span> (cxfResult != 0)
<span class="code-keyword">return</span> cxfResult;
- <span class="code-comment">// Compare QueryParam annotations
-</span> Set<<span class="code-object">String</span>> qParams = getParams((<span class="code-object">String</span>) message.get(Message.QUERY_STRING));
- <span class="code-object">int</span> op1Counter = getMatchingRate(getAnnotations(oper1.getMethodToInvoke().getParameterAnnotations()),
- qParams);
- <span class="code-object">int</span> op2Counter = getMatchingRate(getAnnotations(oper2.getMethodToInvoke().getParameterAnnotations()),
- qParams);
+ <span class="code-object">int</span> op1Counter = getMatchingRate(oper1, message);
+ <span class="code-object">int</span> op2Counter = getMatchingRate(oper2, message);
<span class="code-keyword">return</span> op1Counter == op2Counter
? 0
@@ -765,62 +777,48 @@ A custom ResourceComparator can be used
/**
* This method calculates a number indicating a good or bad match between
- * queryParams from request and annotated method parameters. A higher number
- * means a better match.
+ * values provided within the request and expected method parameters. A
+ * higher number means a better match.
*
- * @param annotations
- * Map contains name of QueryParam method parameters as a key and
- * a <span class="code-object">Boolean</span> value indicating an existing <span class="code-keyword">default</span> value <span class="code-keyword">for</span> <span class="code-keyword">this</span>
- * parameter.
- * @param queryParams
- * A Set of query parameters provided within the request
+ * @param operation
+ * The operation to be rated, based on contained parameterInfo
+ * values.
+ * @param message
+ * A message containing query from user request
* @<span class="code-keyword">return</span> A positive or negative number, indicating a good match between
* query and method
*/
- <span class="code-keyword">protected</span> <span class="code-object">int</span> getMatchingRate(Map<<span class="code-object">String</span>, <span class="code-object">Boolean</span>> annotations, Set<<span class="code-object">String</span>> queryParams) {
- <span class="code-object">int</span> rate = 0;
- <span class="code-keyword">for</span> (<span class="code-object">String</span> anno : annotations.keySet()) {
- <span class="code-keyword">if</span> (queryParams.contains(anno)) {
- <span class="code-comment">// URL query matches one method parameter
-</span> rate += 2;
- } <span class="code-keyword">else</span> <span class="code-keyword">if</span> (!annotations.get(anno).booleanValue()) {
- <span class="code-comment">// No <span class="code-keyword">default</span> value exists <span class="code-keyword">for</span> method parameter
-</span> rate -= 1;
- }
- }
- <span class="code-keyword">return</span> rate;
- }
+ <span class="code-keyword">protected</span> <span class="code-object">int</span> getMatchingRate(OperationResourceInfo operation, Message message) {
- /**
- * @param opParamAnnos
- * Array containing all annotations <span class="code-keyword">for</span> all method parameters
- * @<span class="code-keyword">return</span> Key in Map is QueryParam name, and Value indicates <span class="code-keyword">if</span> a <span class="code-keyword">default</span>
- * value is present.
- */
- <span class="code-keyword">protected</span> Map<<span class="code-object">String</span>, <span class="code-object">Boolean</span>> getAnnotations(Annotation[][] opParamAnnos) {
- Map<<span class="code-object">String</span>, <span class="code-object">Boolean</span>> parameterAnnos = <span class="code-keyword">new</span> HashMap<<span class="code-object">String</span>, <span class="code-object">Boolean</span>>();
+ List<Parameter> params = operation.getParameters();
+ <span class="code-keyword">if</span> (params == <span class="code-keyword">null</span> || params.size() == 0)
+ <span class="code-keyword">return</span> 0;
- <span class="code-keyword">if</span> (opParamAnnos.length == 0)
- <span class="code-keyword">return</span> parameterAnnos;
+ <span class="code-comment">// Get Request QueryParams
+</span> Set<<span class="code-object">String</span>> qParams = getParams((<span class="code-object">String</span>) message.get(Message.QUERY_STRING));
- <span class="code-keyword">for</span> (Annotation[] pAnnos : opParamAnnos) {
- QueryParam qParam = <span class="code-keyword">null</span>;
- DefaultValue dValue = <span class="code-keyword">null</span>;
- <span class="code-keyword">for</span> (Annotation anno : pAnnos) {
- <span class="code-keyword">if</span> (anno <span class="code-keyword">instanceof</span> QueryParam)
- qParam = (QueryParam) anno;
- <span class="code-keyword">if</span> (anno <span class="code-keyword">instanceof</span> DefaultValue)
- dValue = (DefaultValue) anno;
+ <span class="code-object">int</span> rate = 0;
+ <span class="code-keyword">for</span> (Parameter p : params) {
+ <span class="code-keyword">switch</span> (p.getType()) {
+ <span class="code-keyword">case</span> QUERY:
+ <span class="code-keyword">if</span> (qParams.contains(p.getName()))
+ rate += 2;
+ <span class="code-keyword">else</span> <span class="code-keyword">if</span> (p.getDefaultValue() == <span class="code-keyword">null</span>)
+ rate -= 1;
+ <span class="code-keyword">break</span>;
+ <span class="code-comment">// optionally support other parameter types such as headers, etc
+</span> <span class="code-comment">// <span class="code-keyword">case</span> HEADER:
+</span> <span class="code-comment">// <span class="code-keyword">break</span>;
+</span> <span class="code-keyword">default</span>:
+ <span class="code-keyword">break</span>;
}
- parameterAnnos.put(qParam.value(), <span class="code-object">Boolean</span>.valueOf((dValue != <span class="code-keyword">null</span>)));
}
-
- <span class="code-keyword">return</span> parameterAnnos;
+ <span class="code-keyword">return</span> rate;
}
/**
* @param query
- * URL Query
+ * URL Query Example: 'key=value&key2=value2'
* @<span class="code-keyword">return</span> A Set of all keys, contained within query.
*/
<span class="code-keyword">protected</span> Set<<span class="code-object">String</span>> getParams(<span class="code-object">String</span> query) {
@@ -828,19 +826,11 @@ A custom ResourceComparator can be used
<span class="code-keyword">if</span> (query == <span class="code-keyword">null</span> || query.length() == 0)
<span class="code-keyword">return</span> params;
- <span class="code-keyword">try</span> {
- <span class="code-keyword">for</span> (<span class="code-object">String</span> param : query.split(<span class="code-quote">"&"</span>)) {
- <span class="code-object">String</span> pair[] = param.split(<span class="code-quote">"="</span>);
- <span class="code-object">String</span> key = URLDecoder.decode(pair[0], <span class="code-quote">"UTF-8"</span>);
- params.add(key);
- }
- } <span class="code-keyword">catch</span> (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- <span class="code-keyword">return</span> params;
+ MultivaluedMap<<span class="code-object">String</span>, <span class="code-object">String</span>> allQueries =
+ JAXRSUtils.getStructuredParams(query, <span class="code-quote">"&"</span>, <span class="code-keyword">false</span>, <span class="code-keyword">false</span>);
+ <span class="code-keyword">return</span> allQueries.keySet();
}
-}
-
+}
</pre>
</div></div>
@@ -867,7 +857,7 @@ A custom ResourceComparator can be used
</pre>
</div></div>
-<p>Using the custom comparator will lead to getFoo() method accepting a single query parameter selected when a request URI has only one query parameter, and getFoo() method accepting multiple query parameters selected when a request URI has at least two query parameters. Further customizations can be made to get the parameter values affecting the selection process too. </p>
+<p>Using the custom comparator will lead to getFoo() method accepting a single query parameter selected when a request URI has only one query parameter, and getFoo() method accepting multiple query parameters selected when a request URI has at least two query parameters. Further customizations may also be possible. </p>
<h1><a shape="rect" name="JAX-RSBasics-Contextannotations"></a>Context annotations</h1>