
org.marketcetera.marketdata.yahoo.YahooClientImpl Maven / Gradle / Ivy
package org.marketcetera.marketdata.yahoo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.concurrent.GuardedBy;
import org.marketcetera.util.log.SLF4JLoggerProxy;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* Provides a YahooClient
implementation.
*
* @author Colin DuPlantis
* @version $Id: YahooClientImpl.java 16339 2012-10-31 15:59:24Z colin $
* @since 2.1.4
*/
@ClassVersion("$Id: YahooClientImpl.java 16339 2012-10-31 15:59:24Z colin $")
class YahooClientImpl
implements Runnable, YahooClient
{
/* (non-Javadoc)
* @see org.springframework.context.Lifecycle#isRunning()
*/
@Override
public boolean isRunning()
{
return isRunning.get();
}
/* (non-Javadoc)
* @see org.springframework.context.Lifecycle#start()
*/
@Override
public synchronized void start()
{
if(isRunning.get()) {
return;
}
thread = new Thread(this,
"Yahoo Client Thread"); //$NON-NLS-1$
thread.start();
isRunning.set(true);
}
/* (non-Javadoc)
* @see org.springframework.context.Lifecycle#stop()
*/
@Override
public synchronized void stop()
{
if(!isRunning.get()) {
return;
}
try {
if(thread != null) {
thread.interrupt();
try {
thread.join();
} catch (InterruptedException ignored) {}
}
} finally {
thread = null;
isRunning.set(false);
}
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run()
{
try {
while(isRunning.get()) {
synchronized(requests) {
for(YahooRequest request : requests) {
try {
feedServices.doDataReceived(request.getHandle(),
submit(request));
} catch (IOException e) {
SLF4JLoggerProxy.debug(YahooClientImpl.class,
e,
"Retrying...");
}
}
}
Thread.sleep(feedServices.getRefreshInterval());
}
} catch (InterruptedException e) {
}
}
/* (non-Javadoc)
* @see org.marketcetera.marketdata.yahoo.YahooClient#login(org.marketcetera.marketdata.yahoo.YahooFeedCredentials)
*/
@Override
public boolean login(YahooFeedCredentials inCredentials)
{
credentials = inCredentials;
start();
return isRunning();
}
/* (non-Javadoc)
* @see org.marketcetera.marketdata.yahoo.YahooClient#logout()
*/
@Override
public void logout()
{
stop();
}
/* (non-Javadoc)
* @see org.marketcetera.marketdata.yahoo.YahooClient#isLoggedIn()
*/
@Override
public boolean isLoggedIn()
{
return isRunning();
}
/* (non-Javadoc)
* @see org.marketcetera.marketdata.yahoo.YahooClient#request(org.marketcetera.marketdata.yahoo.YahooRequest)
*/
@Override
public void request(YahooRequest inRequest)
{
synchronized(requests) {
requests.add(inRequest);
}
}
/* (non-Javadoc)
* @see org.marketcetera.marketdata.yahoo.YahooClient#cancel(org.marketcetera.marketdata.yahoo.YahooRequest)
*/
@Override
public void cancel(YahooRequest inRequest)
{
synchronized(requests) {
requests.remove(inRequest);
}
}
/* (non-Javadoc)
* @see org.marketcetera.marketdata.yahoo.YahooClient#getRequestCounter()
*/
@Override
public long getRequestCounter()
{
return requestCounter.get();
}
/* (non-Javadoc)
* @see org.marketcetera.marketdata.yahoo.YahooClient#resetRequestcounter()
*/
@Override
public void resetRequestcounter()
{
requestCounter.set(0);
}
/**
* Create a new YahooClient instance.
*
* @param inFeedServices a YahooFeedServices
value
*/
YahooClientImpl(YahooFeedServices inFeedServices)
{
feedServices = inFeedServices;
}
/**
* Submits the given request and returns the response from Yahoo.
*
* @param inRequest a YahooRequest
value
* @return a String
value
* @throws IOException if an error occurs submitting the request
*/
private String submit(YahooRequest inRequest)
throws IOException
{
StringBuilder response = new StringBuilder();
String query = inRequest.getQuery();
response.append(query).append(QUERY_SEPARATOR);
// Create a URL for the desired page
URL url = new URL(credentials.getURL() + query.replaceAll(",", //$NON-NLS-1$
"")); //$NON-NLS-1$
SLF4JLoggerProxy.trace(YahooClientImpl.class,
"Submitting request for {}", //$NON-NLS-1$
url);
// Read all the text returned by the server
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
requestCounter.incrementAndGet();
String str;
while ((str = in.readLine()) != null) {
// str is one line of text; readLine() strips the newline character(s)
response.append(str);
}
in.close();
return response.toString();
}
/**
* sentinel value used to separate query tokens
*/
static final String QUERY_SEPARATOR = "&&/&&"; //$NON-NLS-1$
/**
* sentinel value used to separate query tokens
*/
static final String FIELD_DELIMITER = ","; //$NON-NLS-1$
/**
* sentinel value used to separate query tokens
*/
static final String DELIMITER_SYMBOL = ",?"; //$NON-NLS-1$
/**
* Yahoo feed services value
*/
private final YahooFeedServices feedServices;
/**
* thread used for submitting requests
*/
private volatile Thread thread;
/**
* credentials used for the Yahoo connection
*/
private volatile YahooFeedCredentials credentials;
/**
* indicates if the client is running
*/
private final AtomicBoolean isRunning = new AtomicBoolean(false);
/**
* the active Yahoo requests
*/
@GuardedBy("requests")
private final Set requests = new HashSet();
/**
* the counter used to keep track of the number of requests
*/
private final AtomicLong requestCounter = new AtomicLong(0);
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy