01 package xqueryMap;
02
03 /**
04 * This web service illustrates how you can use an XQuery map on a method whose
05 * parameter values are arrays.
06 *
07 * @common:xmlns namespace="http://openuri.org/bea/samples/workshop/xmlmap/inputMultiple" prefix="ns0"
08 * @common:target-namespace namespace="http://workshop.bea.com/InputMapMultiple"
09 */
10 public class InputMapMultiple implements com.bea.jws.WebService
11 {
12 /**
13 * This method accepts three arrays as parameters and returns a simple float. In order
14 * to map to the set of arrays, the XQuery map loops through the incoming XML message,
15 * extracting values and inserting them into the template represented by the map. <br/><br/>
16 *
17 * To test this method, paste the contents of InputMapMultiple.xml into the Test XML
18 * window provided in Test View, then click getTotalPrice.<br/><br/>
19 *
20 * In general, you may find that while the XQuery expression in the source code looks complex,
21 * it resembles programming conventions with which you're already familiar, such as variables,
22 * loops, and return values.<br/><br/>
23 *
24 * Here are a few things to note about the XQuery in this map:<br/>
25 * - An XQuery let clause binds variables (represented by $i, $n, and so on) to the
26 * XML resulting from a path to an item element.<br/>
27 * - for clauses evaluate their expressions and iterate over the items in the resulting
28 * sequence, binding a variable to each item in turn. The bound variables are then used
29 * to insert values into the template of the outgoing message.<br/>
30 * - return clauses return the result of the expressions that follow them.<br/><br/>
31 *
32 * The return-xml XQuery map includes a simple path expression that finds the result of the
33 * method and inserts it into the template for the outgoing message.<br/><br/>
34 *
35 * For the schema that defines the messages, see InputMapMultiple.xsd in the
36 * Schemas project of the SamplesApp application.
37 * <br/>
38 *
39 * @common:operation
40 * @jws:parameter-xml schema-element="ns0:order" xquery::
41 * declare namespace ns0="http://openuri.org/bea/samples/workshop/xmlmap/inputMultiple"
42 * declare namespace ns1="http://workshop.bea.com/InputMapMultiple"
43 *
44 * let $i := $input/ns0:item
45 * return
46 * <ns1:getTotalPrice>
47 * <ns1:nameArr>
48 * {for $n in $i/ns0:name
49 * return
50 * <ns1:String>{data($n)}</ns1:String>}
51 * </ns1:nameArr>
52 * <ns1:amountArr>
53 * {for $a in $i/ns0:amount
54 * return
55 * <ns1:int>{data($a)}</ns1:int>}
56 * </ns1:amountArr>
57 * <ns1:priceArr>
58 * {for $p in $i/ns0:price
59 * return
60 * <ns1:float>{data($p)}</ns1:float>}
61 * </ns1:priceArr>
62 * </ns1:getTotalPrice>::
63 * @jws:return-xml schema-element="ns0:totalPrice" xquery::
64 * declare namespace ns0="http://workshop.bea.com/InputMapMultiple"
65 * declare namespace ns1="http://openuri.org/bea/samples/workshop/xmlmap/inputMultiple"
66 *
67 * <ns1:totalPrice>{data($input/ns0:getTotalPriceResult)}</ns1:totalPrice>
68 * ::
69 */
70 public float getTotalPrice(String [] nameArr, int [] amountArr, float [] priceArr)
71 {
72 float totalPrice = 0.0f;
73
74 // make sure list of items isn't empty
75 if( nameArr != null )
76 {
77 // for each item, compute subtotal and add to total
78 for (int i = 0; i < nameArr.length; i++)
79 {
80 totalPrice += amountArr[i] * priceArr[i];
81 }
82 }
83 return totalPrice;
84 }
85 }
|