001 package xmlBeans.schema;
002
003 import org.openuri.easypo.PurchaseOrderDocument;
004 import org.openuri.easypo.PurchaseOrderDocument.PurchaseOrder;
005 import org.openuri.easypo.priceSummary.PriceSummaryDocument;
006 import org.openuri.easypo.priceSummary.PriceSummaryDocument.PriceSummary;
007 import org.openuri.easypo.priceSummary.PriceType;
008 import org.openuri.easypo.priceSummary.ItemType;
009 import org.openuri.easypo.LineItem;
010
011 /**
012 * This web service illustrates how you can access XML values that are
013 * defined in schema as enumerations. When a schema containing
014 * enumerations is compiled, the generated Java types represent the
015 * enumerations with enumerations of their own. You can access these through
016 * their constants and corresponding int values.
017 *
018 * The schemas used by this service are defined in PriceSummary.xsd and
019 * EasyPO.xsd.
020 *
021 * @common:target-namespace namespace="http://workshop.bea.com/SchemaEnum"
022 */
023 public class SchemaEnum implements com.bea.jws.WebService
024 {
025
026 /**
027 * This method uses values in the incoming XML to construct
028 * a new XML document of a different schema. PriceSummary.xsd, the schema
029 * for the new document, defines XML enumerations for a price
030 * threshold attribute. Items whose price is between $10 and $20 receive
031 * a threshold value of 10.00; items above 20 get a threshold value of
032 * 20.00.<br/><br/>
033 *
034 * This method loops through the purchase order items, creating a summary
035 * document that specifies their threshold value.<br/><br/>
036 *
037 * Test this method by pasting the contents of PurchaseOrder.xml into
038 * the following box. Be sure to paste the test XML in place of the
039 * XML between the <summarizeItems> element tags. Verify
040 * the test by comparing the resulting XML with the XML in PriceSummary.xml.<br/><br/>
041 *
042 * You can use this test's return value in Test View to test
043 * the sortByThreshold method.
044 *
045 * @common:operation
046 */
047 public PriceSummaryDocument summarizeItems(PurchaseOrderDocument poDoc)
048 {
049 PurchaseOrder po = poDoc.getPurchaseOrder();
050
051 /*
052 * Create a new instance of the PriceSummary schema. This is the document
053 * the code creates, extracting values from the purchase order.
054 */
055 PriceSummaryDocument summaryDoc = PriceSummaryDocument.Factory.newInstance();
056 PriceSummary summary = summaryDoc.addNewPriceSummary();
057
058 /*
059 * Create price elements to hold item elements according to their
060 * price threshold.
061 */
062 PriceType priceZero = summary.addNewPrice();
063 PriceType priceTen = summary.addNewPrice();
064 PriceType priceTwenty = summary.addNewPrice();
065
066 /*
067 * Set the threshold attribute value for the two new elements.
068 */
069 priceZero.setThreshold(PriceType.Threshold.BELOW_10_DOLLARS);
070 priceTen.setThreshold(PriceType.Threshold.BETWEEN_10_AND_20_DOLLARS);
071 priceTwenty.setThreshold(PriceType.Threshold.ABOVE_20_DOLLARS);
072
073 /*
074 * Loop through the purchase order line-item elements. If their
075 * price child element is between 10.00 and 20.00, add the line-item
076 * to the price element whose threshold is 10.00. For those over 20.00,
077 * add them to the price element whose threshold is 20.00.
078 */
079 for (int i = 0; i < po.getLineItemArray().length; i++)
080 {
081 LineItem item = po.getLineItemArray(i);
082
083 if (item.getPrice() < 10.00)
084 {
085
086 ItemType newItem = priceZero.addNewItem();
087 newItem.setTitle(item.getDescription());
088 newItem.xsetQuantity(item.xgetQuantity());
089 newItem.setAmount(item.getPrice());
090
091 } else if (item.getPrice() >= 10.00 && item.getPrice() < 20.00)
092 {
093
094 ItemType newItem = priceTen.addNewItem();
095 newItem.setTitle(item.getDescription());
096 newItem.xsetQuantity(item.xgetQuantity());
097 newItem.setAmount(item.getPrice());
098
099 } else if (item.getPrice() >= 20.00)
100 {
101
102 ItemType newItem = priceTwenty.addNewItem();
103 newItem.setTitle(item.getDescription());
104 newItem.xsetQuantity(item.xgetQuantity());
105 newItem.setAmount(item.getPrice());
106 }
107 }
108
109 /* Return the newly created summary document. */
110 return summaryDoc;
111 }
112
113 /**
114 * The sortByThreshold method loops through a price summary to
115 * create a string that lists the items grouped by threshold.
116 * Unlike the summarizeItems method, with creates a new XML
117 * document that contains an attribute whose value is enumerated,
118 * this method retrieves values from an enumeration.<br/><br/>
119 *
120 * This method illustrates how you can use the int value corresponding
121 * to enumerations to specify them in Java switch statements.<br/><br/>
122 *
123 * To test this method, copy the contents of PriceSummary.xml into the
124 * box in Test View. Be sure to paste the test XML in place of the XML
125 * between the <sortByThreshold> element tags.
126 *
127 * @common:operation
128 */
129 public String sortByThreshold(PriceSummaryDocument summaryDoc)
130 {
131 System.out.println(summaryDoc.xmlText());
132 /*
133 * Extract the summary element from the incoming XML, then use it
134 * to extract an array of the price elements.
135 */
136 PriceSummary summary = summaryDoc.getPriceSummary();
137 StringBuffer responseBuffer = new StringBuffer();
138 PriceType[] priceElements = summary.getPriceArray();
139
140 /*
141 * Create string buffers to hold the sorted results of the values
142 * retrieved.
143 */
144 StringBuffer zeroBuffer = new StringBuffer("\n Items under 10 dollars: \n");
145 StringBuffer tenBuffer = new StringBuffer("\n Items between 10 and 20 dollars: \n");
146 StringBuffer twentyBuffer = new StringBuffer("\n Items more than 20 dollars: \n");
147
148 /*
149 * Loop through the price elements, extracting the array of item child
150 * elements in each.
151 */
152 for (int i = 0; i < priceElements.length; i++)
153 {
154 ItemType[] itemElements = priceElements[i].getItemArray();
155
156 /*
157 * Loop through the item elements, binding a variable to each
158 * item element in turn.
159 */
160 for (int j = 0; j < itemElements.length; j++)
161 {
162 ItemType item = itemElements[j];
163
164 /*
165 * For each item element, find out the int value of its price parent
166 * element's threshold attribute value. Append the item's title to
167 * the appropriate string buffer.
168 */
169 switch(priceElements[i].getThreshold().intValue())
170 {
171
172 case PriceType.Threshold.INT_BELOW_10_DOLLARS:
173 zeroBuffer.append(item.getTitle() + "\n");
174 break;
175
176 case PriceType.Threshold.INT_BETWEEN_10_AND_20_DOLLARS:
177 tenBuffer.append(item.getTitle() + "\n");
178 break;
179
180 case PriceType.Threshold.INT_ABOVE_20_DOLLARS:
181 twentyBuffer.append(item.getTitle() + "\n");
182 break;
183
184 default:
185 System.out.println("Yo! Something unexpected happened!");
186 break;
187 }
188 }
189 }
190
191 /*
192 * Combine the two result buffers into one, then return a string from the
193 * combined result.
194 */
195 responseBuffer.append(tenBuffer);
196 responseBuffer.append(twentyBuffer);
197 return responseBuffer.toString();
198 }
199 }
|