/* * 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.wicket.examples.stockquote; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import java.net.URLConnection; /** * Provides access to a SOAP service for getting stock quotes based on a symbol. Found on * http://www.devx.com/Java/Article/27559/0/page/2 */ public class StockQuote { /** * We used to use the www.xmethods.com demo webservice for stockquotes. We now use webservicex, * as xmethods was really overloaded and unreliable. */ private static final String serviceUrl = "http://www.webservicex.net/stockquote.asmx"; /** the symbol to get the quote for. */ private String symbol; /** * Default constructor. */ public StockQuote() { } /** * Constructor setting the symbol to get the quote for. * * @param symbol * the symbol to look up */ public StockQuote(String symbol) { this.symbol = symbol; } /** * Gets the symbol. * * @return the symbol */ public String getSymbol() { return symbol; } /** * Sets the symbol for getting the quote. * * @param symbol */ public void setSymbol(String symbol) { this.symbol = symbol; } /** * Gets a stock quote for the given symbol * * @return the stock quote */ public String getQuote() { final String response = getSOAPQuote(symbol); // make sure we get int start = response.indexOf("<Last>") + "<Last>".length(); int end = response.indexOf("</Last>"); // if the string returned isn't valid, just return empty. if (start < "<Last>".length()) { return "(unknown)"; } String result = response.substring(start, end); return result.equals("0.00") ? "(unknown)" : result; } /** * Calls the SOAP service to get the stock quote for the symbol. * * @param symbol * the name to search for * @return the SOAP response containing the stockquote */ private String getSOAPQuote(String symbol) { String response = ""; try { final URL url = new URL(serviceUrl); final String message = createMessage(symbol); // Create the connection where we're going to send the file. HttpURLConnection httpConn = setUpHttpConnection(url, message.length()); // Everything's set up; send the XML that was read in to // the service. writeRequest(message, httpConn); // Read the response and write it to standard out. response = readResult(httpConn); } catch (Exception e) { e.printStackTrace(); } return response; } /** * Writes the message to the connection. * * @param message * the message to write * @param httpConn * the connection * @throws IOException */ private void writeRequest(String message, HttpURLConnection httpConn) throws IOException { OutputStream out = httpConn.getOutputStream(); out.write(message.getBytes()); out.close(); } /** * Sets up the HTTP connection. * * @param url * the url to connect to * @param length * the length to the input message * @return the HttpurLConnection * @throws IOException * @throws ProtocolException */ private HttpURLConnection setUpHttpConnection(URL url, int length) throws IOException { URLConnection connection = url.openConnection(); HttpURLConnection httpConn = (HttpURLConnection)connection; // Set the appropriate HTTP parameters. httpConn.setRequestProperty("Content-Length", String.valueOf(length)); httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); httpConn.setRequestProperty("SOAPAction", "\"http://www.webserviceX.NET/GetQuote\""); httpConn.setRequestMethod("POST"); httpConn.setDoOutput(true); httpConn.setDoInput(true); return httpConn; } /** * Reads the response from the http connection. * * @param connection * the connection to read the response from * @return the response * @throws IOException */ private String readResult(HttpURLConnection connection) throws IOException { InputStream inputStream = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(inputStream); BufferedReader in = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String inputLine; while ((inputLine = in.readLine()) != null) { sb.append(inputLine); } in.close(); return sb.toString(); } /** * Creates the request message for retrieving a stock quote. * * @param symbol * the symbol to query for * @return the request message */ private String createMessage(String symbol) { StringBuilder message = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); message.append("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"); message.append(" <soap:Body>"); message.append(" <GetQuote xmlns=\"http://www.webserviceX.NET/\">"); message.append(" <symbol>").append(symbol).append("</symbol>"); message.append(" </GetQuote>"); message.append(" </soap:Body>"); message.append("</soap:Envelope>"); return message.toString(); } }