net.sourceforge.eclipsetrader.directaworld.Feed.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.eclipsetrader.directaworld.Feed.java

Source

/*
 * Copyright (c) 2004-2006 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 net.sourceforge.eclipsetrader.directaworld;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import net.sourceforge.eclipsetrader.core.CorePlugin;
import net.sourceforge.eclipsetrader.core.IFeed;
import net.sourceforge.eclipsetrader.core.db.Security;
import net.sourceforge.eclipsetrader.core.db.feed.Quote;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
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.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

public class Feed implements IFeed, Runnable {
    private Map map = new HashMap();

    private Thread thread;

    private boolean stopping = false;

    private String userName = ""; //$NON-NLS-1$

    private String password = ""; //$NON-NLS-1$

    private NumberFormat nf = NumberFormat.getInstance();

    private NumberFormat pf = NumberFormat.getInstance();

    private SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //$NON-NLS-1$

    public Feed() {
    }

    /* (non-Javadoc)
     * @see net.sourceforge.eclipsetrader.core.IFeed#subscribe(net.sourceforge.eclipsetrader.core.db.Security)
     */
    public void subscribe(Security security) {
        String symbol = security.getQuoteFeed().getSymbol();
        if (symbol == null || symbol.length() == 0)
            symbol = security.getCode();
        map.put(security, symbol);
    }

    /* (non-Javadoc)
     * @see net.sourceforge.eclipsetrader.core.IFeed#unSubscribe(net.sourceforge.eclipsetrader.core.db.Security)
     */
    public void unSubscribe(Security security) {
        map.remove(security);
    }

    /* (non-Javadoc)
     * @see net.sourceforge.eclipsetrader.core.IFeed#start()
     */
    public void start() {
        if (thread == null) {
            userName = DirectaWorldPlugin.getDefault().getPreferenceStore()
                    .getString(DirectaWorldPlugin.USERNAME_PREFS);
            password = DirectaWorldPlugin.getDefault().getPreferenceStore()
                    .getString(DirectaWorldPlugin.PASSWORD_PREFS);

            if (userName.length() == 0 || password.length() == 0) {
                LoginDialog dlg = new LoginDialog(userName, password);
                if (dlg.open() != LoginDialog.OK)
                    return;

                userName = dlg.getUserName();
                password = dlg.getPassword();
            }

            stopping = false;
            thread = new Thread(this);
            thread.start();
        }
    }

    /* (non-Javadoc)
     * @see net.sourceforge.eclipsetrader.core.IFeed#stop()
     */
    public void stop() {
        stopping = true;
        if (thread != null) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            thread = null;
        }
    }

    /* (non-Javadoc)
     * @see net.sourceforge.eclipsetrader.core.IFeed#snapshot()
     */
    public void snapshot() {
        userName = DirectaWorldPlugin.getDefault().getPreferenceStore()
                .getString(DirectaWorldPlugin.USERNAME_PREFS);
        password = DirectaWorldPlugin.getDefault().getPreferenceStore()
                .getString(DirectaWorldPlugin.PASSWORD_PREFS);

        if (userName.length() == 0 || password.length() == 0) {
            LoginDialog dlg = new LoginDialog(userName, password);
            if (dlg.open() != LoginDialog.OK)
                return;

            userName = dlg.getUserName();
            password = dlg.getPassword();
        }

        update();
    }

    /* (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    public void run() {
        long nextRun = System.currentTimeMillis() + 2 * 1000;

        while (!stopping) {
            if (System.currentTimeMillis() >= nextRun) {
                int requiredDelay = update();
                if (requiredDelay > 0)
                    nextRun = System.currentTimeMillis() + requiredDelay * 1000;
                else
                    nextRun = System.currentTimeMillis() + 16 * 1000;
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
        }

        thread = null;
    }

    private int update() {
        int i, requiredDelay = -1;
        String inputLine;

        nf.setGroupingUsed(true);
        nf.setMinimumFractionDigits(0);
        nf.setMaximumFractionDigits(0);

        pf.setGroupingUsed(true);
        pf.setMinimumFractionDigits(4);
        pf.setMaximumFractionDigits(4);

        try {
            // Legge la pagina contenente gli ultimi prezzi
            String host = "registrazioni.directaworld.it";
            StringBuffer url = new StringBuffer("http://" + host + "/cgi-bin/qta?idx=alfa&modo=t&appear=n"); //$NON-NLS-1$
            i = 0;
            for (Iterator iter = map.values().iterator(); iter.hasNext();)
                url.append("&id" + (++i) + "=" + (String) iter.next()); //$NON-NLS-1$ //$NON-NLS-2$
            for (; i < 30; i++)
                url.append("&id" + (i + 1) + "="); //$NON-NLS-1$ //$NON-NLS-2$
            url.append("&u=" + userName + "&p=" + password); //$NON-NLS-1$ //$NON-NLS-2$

            HttpClient client = new HttpClient();
            client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

            BundleContext context = DirectaWorldPlugin.getDefault().getBundle().getBundleContext();
            ServiceReference reference = context.getServiceReference(IProxyService.class.getName());
            if (reference != null) {
                IProxyService proxy = (IProxyService) context.getService(reference);
                IProxyData data = proxy.getProxyDataForHost(host, IProxyData.HTTP_PROXY_TYPE);
                if (data != null) {
                    if (data.getHost() != null)
                        client.getHostConfiguration().setProxy(data.getHost(), data.getPort());
                    if (data.isRequiresAuthentication())
                        client.getState().setProxyCredentials(AuthScope.ANY,
                                new UsernamePasswordCredentials(data.getUserId(), data.getPassword()));
                }
            }

            HttpMethod method = new GetMethod(url.toString());
            method.setFollowRedirects(true);
            client.executeMethod(method);

            BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));
            while ((inputLine = in.readLine()) != null) {
                if (inputLine.indexOf("<!--QT START HERE-->") != -1) //$NON-NLS-1$
                {
                    while ((inputLine = in.readLine()) != null) {
                        if (inputLine.indexOf("<!--QT STOP HERE-->") != -1) //$NON-NLS-1$
                            break;
                        parseLine(inputLine);
                    }
                } else if (inputLine.indexOf("Sara' possibile ricaricare la pagina tra") != -1) //$NON-NLS-1$
                {
                    int beginIndex = inputLine.indexOf("tra ") + 4; //$NON-NLS-1$
                    int endIndex = inputLine.indexOf("sec") - 1; //$NON-NLS-1$
                    try {
                        requiredDelay = Integer.parseInt(inputLine.substring(beginIndex, endIndex)) + 1;
                    } catch (Exception e) {
                        CorePlugin.logException(e);
                    }
                }
            }
            in.close();
        } catch (Exception e) {
            CorePlugin.logException(e);
        }

        return requiredDelay;
    }

    public void parseLine(String line) throws ParseException {
        String[] item = line.split(";"); //$NON-NLS-1$

        for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
            Security security = (Security) iter.next();
            if (item[0].equalsIgnoreCase((String) map.get(security))) {
                Double open = null, high = null, low = null, close = null;
                Quote quote = new Quote();

                // item[1] - Nome
                quote.setLast(pf.parse(item[2]).doubleValue());
                // item[3] - Variazione
                quote.setVolume(nf.parse(item[4]).intValue());
                try {
                    if (item[5].length() == 7)
                        item[5] = item[5].charAt(0) + ":" + item[5].charAt(1) + item[5].charAt(3) + ":" //$NON-NLS-1$//$NON-NLS-2$
                                + item[5].charAt(4) + item[5].charAt(6);
                    quote.setDate(df.parse(item[6] + " " + item[5])); //$NON-NLS-1$
                } catch (Exception e) {
                }

                quote.setBid(pf.parse(item[7]).doubleValue());
                quote.setBidSize(nf.parse(item[8]).intValue());
                quote.setAsk(pf.parse(item[9]).doubleValue());
                quote.setAskSize(nf.parse(item[10]).intValue());
                // item[11] - ???
                open = new Double(pf.parse(item[12]).doubleValue());
                close = new Double(pf.parse(item[13]).doubleValue());
                low = new Double(pf.parse(item[14]).doubleValue());
                high = new Double(pf.parse(item[15]).doubleValue());

                security.setQuote(quote, open, high, low, close);
                break;
            }
        }
    }
}