/*
* 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 samples.common;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.xpath.AXIOMXPath;
import javax.xml.namespace.QName;
import java.util.Random;
import java.util.List;
import java.util.Iterator;
/**
* A class that can create messages to, and parse replies from our sample StockQuote service
*/
public class StockQuoteHandler {
private static final Random RANDOM = new Random();
/**
* Create a new custom quote request with a body as follows
* <m0:CheckPriceRequest xmlns:m0="http://services.samples">
* <m0:Code>symbol</m0:Code>
* </m0:CheckPriceRequest>
* @param symbol the stock symbol
* @return OMElement for SOAP body
*/
public static OMElement createCustomQuoteRequest(String symbol) {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace ns = factory.createOMNamespace(
"http://services.samples", "m0");
OMElement chkPrice = factory.createOMElement("CheckPriceRequest", ns);
OMElement code = factory.createOMElement("Code", ns);
chkPrice.addChild(code);
code.setText(symbol);
return chkPrice;
}
/**
* Create a new quote request with a body as follows
* <m:GetQuote xmlns:m="http://services.samples">
* <m:request>
* <m:symbol>IBM</m:symbol>
* </m:request>
* </m:GetQuote>
* @param symbol the stock symbol
* @return OMElement for SOAP body
*/
public static OMElement createStandardQuoteRequest(String symbol, int itrCount) {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace ns = factory.createOMNamespace("http://services.samples", "m0");
OMElement getQuote = factory.createOMElement("getQuote", ns);
for (int i =0; i<itrCount; i++) {
OMElement request = factory.createOMElement("request", ns);
OMElement symb = factory.createOMElement("symbol", ns);
request.addChild(symb);
getQuote.addChild(request);
symb.setText(symbol);
}
return getQuote;
}
/**
* Create a new full quote request with a body as follows
* <m:GetFullQuote xmlns:m="http://services.samples">
* <m:request>
* <m:symbol>IBM</m:symbol>
* </m:request>
* </m:GetFullQuote>
* @param symbol the stock symbol
* @return OMElement for SOAP body
*/
public static OMElement createFullQuoteRequest(String symbol) {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace ns = factory.createOMNamespace("http://services.samples", "m0");
OMElement getQuote = factory.createOMElement("getFullQuote", ns);
OMElement request = factory.createOMElement("request", ns);
OMElement symb = factory.createOMElement("symbol", ns);
request.addChild(symb);
getQuote.addChild(request);
symb.setText(symbol);
return getQuote;
}
/**
* Create a new market activity request with a body as follows
* <m:getMarketActivity xmlns:m="http://services.samples">
* <m:request>
* <m:symbol>IBM</m:symbol>
* ...
* <m:symbol>MSFT</m:symbol>
* </m:request>
* </m:getMarketActivity>
* @return OMElement for SOAP body
*/
public static OMElement createMarketActivityRequest() {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace ns = factory.createOMNamespace("http://services.samples", "m0");
OMElement getQuote = factory.createOMElement("getMarketActivity", ns);
OMElement request = factory.createOMElement("request", ns);
OMElement symb = null;
for (int i=0; i<100; i++) {
symb = factory.createOMElement("symbols", ns);
symb.setText(randomString(3));
request.addChild(symb);
}
getQuote.addChild(request);
return getQuote;
}
/**
* Create a new order for a quantiry of a stock at a given price
* <m:placeOrder xmlns:m="http://services.samples">
* <m:order>
* <m:price>3.141593E0</m:price>
* <m:quantity>4</m:quantity>
* <m:symbol>IBM</m:symbol>
* </m:order>
* </m:placeOrder>
*
* @param purchPrice the purchase price
* @param qty the quantiry
* @param symbol the stock
* @return an OMElement payload for the order
*/
public static OMElement createPlaceOrderRequest(double purchPrice, int qty, String symbol) {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace ns = factory.createOMNamespace("http://services.samples", "m0");
OMElement placeOrder= factory.createOMElement("placeOrder", ns);
OMElement order = factory.createOMElement("order", ns);
OMElement price = factory.createOMElement("price", ns);
OMElement quantity = factory.createOMElement("quantity", ns);
OMElement symb = factory.createOMElement("symbol", ns);
price.setText(Double.toString(purchPrice));
quantity.setText(Integer.toString(qty));
symb.setText(symbol);
order.addChild(price);
order.addChild(quantity);
order.addChild(symb);
placeOrder.addChild(order);
return placeOrder;
}
/**
* Digests the standard StockQuote response and extracts the last trade price
* @param result
* @return
* @throws javax.xml.stream.XMLStreamException
*
* <ns:getQuoteResponse xmlns:ns="http://services.samples">
* <ns:return>
* <ns:change>-2.3238706829151026</ns:change>
* ...
* <ns:symbol>IBM</ns:symbol>
* <ns:volume>17949</ns:volume>
* </ns:return>
* </ns:getQuoteResponse>
*/
public static String parseStandardQuoteResponse(OMElement result) throws Exception {
AXIOMXPath xPath = new AXIOMXPath("//ns:last");
xPath.addNamespace("ns","http://services.samples/xsd");
OMElement last = (OMElement) xPath.selectSingleNode(result);
if (last != null) {
return last.getText();
} else {
throw new Exception("Unexpected response : " + result);
}
}
/**
* <ns:getFullQuoteResponse xmlns:ns="http://services.samples">
<ns:return>
<tradeHistory xmlns="http://services.samples">
<day>0</day>
<quote>
<change>-2.367492989603466</change>
<earnings>13.14956711287784</earnings>
<high>-155.58844623078153</high>
<last>157.47582716569198</last>
<lastTradeTimestamp>Mon Apr 16 23:29:58 LKT 2007</lastTradeTimestamp>
<low>-155.31924118819015</low>
<marketCap>6373750.467022192</marketCap>
<name>IBM Company</name>
<open>-154.84071720443495</open>
<peRatio>-17.353258031353164</peRatio>
<percentageChange>-1.3910235348298898</percentageChange>
<prevClose>170.1979104108393</prevClose>
<symbol>IBM</symbol>
<volume>8935</volume>
</quote>
</tradeHistory>
<tradeHistory xmlns="http://services.samples">
<day>1</day>
<quote>
<change>3.794122022240518</change>
<earnings>-8.656536789776045</earnings>
<high>176.77136802352928</high>
<last>170.28677783945102</last>
<lastTradeTimestamp>Mon Apr 16 23:29:58 LKT 2007</lastTradeTimestamp>
<low>-166.64126635049223</low>
<marketCap>-6112014.916847887</marketCap>
<name>IBM Company</name>
<open>-168.30884678174925</open>
<peRatio>-18.644628475049693</peRatio>
<percentageChange>-2.29678289479374</percentageChange>
<prevClose>-165.19288918603885</prevClose>
<symbol>IBM</symbol>
<volume>5825</volume>
</quote>
</tradeHistory>
...
</ns:return>
</ns:getFullQuoteResponse>
*
* @param result
* @return
* @throws Exception
*/
public static String parseFullQuoteResponse(OMElement result) throws Exception {
AXIOMXPath xPath = new AXIOMXPath("//ns:last");
xPath.addNamespace("ns","http://services.samples/xsd");
List lastNodes = xPath.selectNodes(result);
if (lastNodes == null) {
throw new Exception("Unexpected response : " + result);
}
double total = 0;
int count = 0;
Iterator iter = lastNodes.iterator();
while (iter.hasNext()) {
OMElement last = (OMElement) iter.next();
total += Double.parseDouble(last.getText());
count++;
}
return Double.toString(total/count);
}
/**
* <ns:getMarketActivityResponse xmlns:ns="http://services.samples">
<ns:return>
<quotes xmlns="http://services.samples">
<change>4.183958555301184</change>
<earnings>-8.585281368244686</earnings>
<high>-158.70528805517333</high>
<last>160.83784480071603</last>
<lastTradeTimestamp>Tue Apr 17 02:21:30 LKT 2007</lastTradeTimestamp>
<low>-157.4950051860593</low>
<marketCap>5.9907588733164035E7</marketCap>
<name>EHM Company</name>
<open>-160.18368223376558</open>
<peRatio>24.0926205053427</peRatio>
<percentageChange>-2.6141745708181374</percentageChange>
<prevClose>-160.04893483420904</prevClose>
<symbol>EHM</symbol>
<volume>6319</volume>
</quotes>
<quotes xmlns="http://services.samples">
....
<volume>7613</volume>
</quotes>
...
</ns:return>
<ns:getMarketActivityResponse>
* @param result
* @return the average last price for each stock symbol
* @throws Exception
*/
public static String parseMarketActivityResponse(OMElement result) throws Exception {
AXIOMXPath xPath = new AXIOMXPath("//ns:last");
xPath.addNamespace("ns","http://services.samples/xsd");
List lastNodes = xPath.selectNodes(result);
if (lastNodes == null) {
throw new Exception("Unexpected response : " + result);
}
double total = 0;
int count = 0;
Iterator iter = lastNodes.iterator();
while (iter.hasNext()) {
OMElement last = (OMElement) iter.next();
total += Double.parseDouble(last.getText());
count++;
}
return Double.toString(total/count);
}
/**
* Digests the custom quote response and extracts the last trade price
* @param result
* @return
* @throws javax.xml.stream.XMLStreamException
*
* <CheckPriceResponse xmlns="http://ws.invesbot.com/" >
* <Code>IBM</Code>
* <Price>82.90</Price>
* </CheckPriceResponse>
*/
public static String parseCustomQuoteResponse(OMElement result) throws Exception {
AXIOMXPath xPath = new AXIOMXPath("//ns:Price");
xPath.addNamespace("ns","http://services.samples/xsd");
OMElement price = (OMElement) xPath.selectSingleNode(result);
if (price != null) {
return price.getText();
} else {
throw new Exception("Unexpected response : " + result);
}
}
/**
* Return a random String of letters
* @param count number of letters
* @return the random string
*/
public static String randomString(int count) {
int end = 'Z' + 1;
int start = 'A';
StringBuffer buffer = new StringBuffer();
int gap = end - start;
while (count-- != 0) {
char ch;
ch = (char) (RANDOM.nextInt(gap) + start);
if (Character.isLetter(ch)) {
buffer.append(ch);
} else {
count++;
}
}
return buffer.toString();
}
}