/*
* Copyright (c) 2004-2011 Marco Maccaferri and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.yahoo.internal.core;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.eclipse.core.net.proxy.IProxyData;
import org.eclipse.core.net.proxy.IProxyService;
import org.eclipsetrader.core.feed.IFeedIdentifier;
import org.eclipsetrader.core.feed.IFeedProperties;
import org.eclipsetrader.core.instruments.ISecurity;
import org.eclipsetrader.yahoo.internal.YahooActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
public class Util {
public static final String snapshotFeedHost = "download.finance.yahoo.com"; //$NON-NLS-1$
public static final String streamingFeedHost = "streamerapi.finance.yahoo.com"; //$NON-NLS-1$
public static final String historyFeedHost = "ichart.finance.yahoo.com"; //$NON-NLS-1$
private Util() {
}
public static String getSymbol(IFeedIdentifier identifier) {
String symbol = identifier.getSymbol();
IFeedProperties properties = (IFeedProperties) identifier.getAdapter(IFeedProperties.class);
if (properties != null) {
if (properties.getProperty("org.eclipsetrader.yahoo.symbol") != null) {
symbol = properties.getProperty("org.eclipsetrader.yahoo.symbol");
}
}
return symbol;
}
/**
* Builds the http method for live prices snapshot download.
*
* @return the method.
*/
public static HttpMethod getSnapshotFeedMethod(String[] symbols) {
GetMethod method = new GetMethod("http://" + snapshotFeedHost + "/download/javasoft.beans");
StringBuffer s = new StringBuffer();
for (int i = 0; i < symbols.length; i++) {
if (i != 0) {
s.append(" "); //$NON-NLS-1$
}
s.append(symbols[i]);
}
method.setQueryString(new NameValuePair[] {
new NameValuePair("symbols", s.toString()),
new NameValuePair("format", "sl1d1t1c1ohgvbapb6a5"),
});
return method;
}
/**
* Builds the http method for streaming prices download.
*
* @return the method.
*/
public static HttpMethod getStreamingFeedMethod(String[] symbols) {
GetMethod method = new GetMethod("http://" + streamingFeedHost + "/streamer/1.0");
StringBuffer s = new StringBuffer();
for (int i = 0; i < symbols.length; i++) {
if (i != 0) {
s.append(","); //$NON-NLS-1$
}
s.append(symbols[i]);
}
method.setQueryString(new NameValuePair[] {
new NameValuePair("s", s.toString()),
new NameValuePair("k", "a00,a50,b00,b60,g00,h00,j10,l10,t10,v00"),
new NameValuePair("j", "c10,l10,p20,t10"),
new NameValuePair("r", "0"),
new NameValuePair("marketid", "us_market"),
new NameValuePair("callback", "parent.yfs_u1f"),
new NameValuePair("mktmcb", "parent.yfs_mktmcb"),
new NameValuePair("gencallback", "parent.yfs_gencb"),
});
method.setFollowRedirects(true);
return method;
}
/**
* Builds the http method for historycal prices download.
*
* @return the method.
*/
public static HttpMethod getHistoryFeedMethod(IFeedIdentifier identifier, Date from, Date to) throws URIException {
String symbol = getSymbol(identifier);
Calendar fromDate = Calendar.getInstance();
fromDate.setTime(from);
Calendar toDate = Calendar.getInstance();
toDate.setTime(to);
String prefix = "/instrument/1.0/";
String suffix = "/chartdata;type=quote";
URI uri = new URI("http", "chartapi.finance.yahoo.com", prefix + symbol.toLowerCase() + suffix, "");
GetMethod method = new GetMethod();
method.setURI(uri);
method.setQueryString(new NameValuePair[] {
new NameValuePair("s", symbol),
new NameValuePair("d", String.valueOf(toDate.get(Calendar.MONTH))),
new NameValuePair("e", String.valueOf(toDate.get(Calendar.DAY_OF_MONTH))),
new NameValuePair("f", String.valueOf(toDate.get(Calendar.YEAR))),
new NameValuePair("g", "d"),
new NameValuePair("a", String.valueOf(fromDate.get(Calendar.MONTH))),
new NameValuePair("b", String.valueOf(fromDate.get(Calendar.DAY_OF_MONTH))),
new NameValuePair("c", String.valueOf(fromDate.get(Calendar.YEAR))),
new NameValuePair("ignore", ".csv"),
});
method.setFollowRedirects(true);
try {
System.out.println(method.getURI().toString());
} catch (URIException e) {
e.printStackTrace();
}
return method;
}
public static HttpMethod get1DayHistoryFeedMethod(IFeedIdentifier identifier) throws URIException {
String symbol = getSymbol(identifier);
String prefix = "/instrument/1.0/";
String suffix = "/chartdata;type=quote;range=1d/csv/";
URI uri = new URI("http", "chartapi.finance.yahoo.com", prefix + symbol.toLowerCase() + suffix, "");
GetMethod method = new GetMethod();
method.setURI(uri);
method.setFollowRedirects(true);
return method;
}
public static HttpMethod get5DayHistoryFeedMethod(IFeedIdentifier identifier) throws URIException {
String symbol = getSymbol(identifier);
String prefix = "/instrument/1.0/";
String suffix = "/chartdata;type=quote;range=5d/csv/";
URI uri = new URI("http", "chartapi.finance.yahoo.com", prefix + symbol.toLowerCase() + suffix, "");
GetMethod method = new GetMethod();
method.setURI(uri);
method.setFollowRedirects(true);
return method;
}
public static HttpMethod get1YearHistoryFeedMethod(IFeedIdentifier identifier, int year) throws URIException {
String symbol = getSymbol(identifier);
String prefix = "/instrument/1.0/";
String suffix = "/chartdata;type=quote;ys=" + year + ";yz=1/csv/";
URI uri = new URI("http", "chartapi.finance.yahoo.com", prefix + symbol.toLowerCase() + suffix, "");
GetMethod method = new GetMethod();
method.setURI(uri);
method.setFollowRedirects(true);
return method;
}
public static HttpMethod getDividendsHistoryMethod(IFeedIdentifier identifier, Date from, Date to) {
String symbol = getSymbol(identifier);
Calendar fromDate = Calendar.getInstance();
fromDate.setTime(from);
Calendar toDate = Calendar.getInstance();
toDate.setTime(to);
GetMethod method = new GetMethod("http://" + historyFeedHost + "/table.csv");
method.setQueryString(new NameValuePair[] {
new NameValuePair("s", symbol),
new NameValuePair("d", String.valueOf(toDate.get(Calendar.MONTH))),
new NameValuePair("e", String.valueOf(toDate.get(Calendar.DAY_OF_MONTH))),
new NameValuePair("f", String.valueOf(toDate.get(Calendar.YEAR))),
new NameValuePair("g", "v"),
new NameValuePair("a", String.valueOf(fromDate.get(Calendar.MONTH))),
new NameValuePair("b", String.valueOf(fromDate.get(Calendar.DAY_OF_MONTH))),
new NameValuePair("c", String.valueOf(fromDate.get(Calendar.YEAR))),
new NameValuePair("ignore", ".csv"),
});
method.setFollowRedirects(true);
return method;
}
public static URL getRSSNewsFeedForSecurity(ISecurity security) throws MalformedURLException, URIException, NullPointerException {
IFeedIdentifier identifier = (IFeedIdentifier) security.getAdapter(IFeedIdentifier.class);
if (identifier == null) {
return null;
}
String symbol = getSymbol(identifier);
URI feedUrl = new URI("http://finance.yahoo.com/rss/headline?s=" + symbol, false);
return new URL(feedUrl.toString());
}
public static void setupProxy(HttpClient client, String host) throws URISyntaxException {
if (YahooActivator.getDefault() == null) {
return;
}
BundleContext context = YahooActivator.getDefault().getBundle().getBundleContext();
ServiceReference reference = context.getServiceReference(IProxyService.class.getName());
if (reference != null) {
IProxyService proxyService = (IProxyService) context.getService(reference);
IProxyData[] proxyData = proxyService.select(new java.net.URI(IProxyData.HTTP_PROXY_TYPE, "//" + host, null));
if (proxyData != null && proxyData.length != 0) {
if (proxyData[0].getHost() != null) {
client.getHostConfiguration().setProxy(proxyData[0].getHost(), proxyData[0].getPort());
}
if (proxyData[0].isRequiresAuthentication()) {
client.getState().setProxyCredentials(AuthScope.ANY, new UsernamePasswordCredentials(proxyData[0].getUserId(), proxyData[0].getPassword()));
}
}
context.ungetService(reference);
}
}
}