XML Feeds

.

[java-dev] Re: experience with stockwatch anyone?

Samuel Van Ransbeeck Thinksamuel at yahoo.com
Sun Oct 21 06:38:35 MDT 2007


Ok, so i managed to do the first part (getting more info from the SE) myself (however, still have to compile it) but another problem is, I want to get the numbers hat i get in number boxes to use those numbers as a source for my composition. Apparently you have to create an outlet for that, but what should i write
	declareOutlets(new int[]{DataTypes.ALL});
this is alrteady there, but i now i only get <END> in a message box. What do I have to write to get a separate outlet for numbers?
Thanks in advance 
amuel

btw, here is the full code as it appears in the java folder of max

import com.cycling74.max.*;
import java.net.*;
import java.io.*;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Enumeration;

//finance.yahoo.com/d/quotes.csv?f=sl1d1t1c1ohgv&e=.csv&s=INTC+SUNW

public class StockWatch extends MaxObject implements Runnable, Executable
{
    //Attributes
    double    interval = 30 * 1000; //30 seconds

    static final int SYM        = 0;
    static final int LAST_TRADE = 1;
    static final int DAY        = 2;
    static final int TIME       = 3;
    static final int CHANGE     = 4;
    
    private String    _base_url     = "http://finance.yahoo.com/d/quotes.csv?f=sl1d1t1c1ohgv&e=.csv";
    private String    _sym_string   = "&s=";
    private Hashtable _syms;
    private boolean   _first_sym = true;
    private Thread    _t;
    private MaxClock  _cl;
    

    public StockWatch(Atom[] args)
    {
	declareInlets(new int[]{DataTypes.ALL});
	declareOutlets(new int[]{DataTypes.ALL});
	declareAttribute("interval","_get_interval","_set_interval");
	//virtual attribute
	declareAttribute("quotes","_get_quotes","_set_quotes");

	_syms = new Hashtable();
	_cl = new MaxClock(this);
    }
    
    private void _set_interval(int i)
    {
	interval = i * 1000;
    }

    private Atom[] _get_interval()
    {
	return new Atom[]{Atom.newAtom((float)interval / 1000)};
    }

    private void _set_quotes(Atom[] args)
    {
	_syms.clear();
	for(int i = 0; i < args.length; i++)
	    {
		if(args[i].isString())
		    _add_quote(args[i].toString());
		else
		    System.out.println("Invalid Symbol: "+args[i].toString());
	    }
    }

    private Atom[] _get_quotes()
    {
	Enumeration e = _syms.keys();
	Vector  tmp   = new Vector();
	Atom[] ret = null;
	while(e.hasMoreElements())
		tmp.addElement(Atom.newAtom((String)e.nextElement()));
	
	ret = new Atom[tmp.size()];
	for(int i = 0; i < tmp.size();i++)
	    ret[i] = (Atom)tmp.elementAt(i);
	
	return ret;
    }


    public void bang()
    {
	_cl.delay(0);
    }
    
    public void stop()
    {
	_cl.unset();
    }

    public void clear()
    {
	_syms.clear();
    }

        
    public void addQuote(String quote)
    {
	_add_quote(quote);
    }

    public void removeQuote(String quote)
    {
	quote = quote.toUpperCase();
	if(_syms.containsKey(quote))
	    _syms.remove(quote);
    }


    public void execute()
    {

	_t = new Thread(this);
	try{
	    _t.start();
	}catch(Exception e)
	    {
		e.printStackTrace();
	    }

	_cl.delay(interval);
    }

    public void run()
    {
	_do_lookup();
	Enumeration e = _syms.keys();
	outlet(0,"BEGIN");
	while(e.hasMoreElements())
	    {
		String[] nfo = (String[])_syms.get(e.nextElement());
		Atom[] list = new Atom[]{Atom.newAtom(nfo[0]),Atom.newAtom(nfo[1]),
					 Atom.newAtom(nfo[2]),Atom.newAtom(nfo[3]),
					 Atom.newAtom(nfo[4])};
		outlet(0,list);
	    }
	outlet(0,"END");

    }

    private void _add_quote(String sym)
    {
	sym = sym.toUpperCase();
	if(!_syms.containsKey(sym))
	    {
		_syms.put(sym, new String[5]);
	    }
    }
    
    private void _do_lookup()
    {
	try{
	    String url = genURL();
	    int c;
	    URL u = new URL(url);
	    BufferedInputStream in = new BufferedInputStream(u.openStream());
	    StringBuffer sb = new StringBuffer();
	    while((c = in.read()) != -1)
		{
		    if(c == (int)'
')
			{
			    _stuff_into_hash(sb.toString());
			    sb.setLength(0);
			    continue;
			}
		    sb.append((char)c);
		}

	    in.close();
	}catch(Exception e)
	    {
		e.printStackTrace();
	    }
    }
    
    private String genURL()
    {
	Enumeration e = _syms.keys();
	int cnt = 0;
	StringBuffer ret = new StringBuffer(_base_url);
	while(e.hasMoreElements())
	    {
		if(cnt == 0)
		    ret.append(_sym_string+(String)e.nextElement());
		else
		    ret.append("+"+(String)e.nextElement());
		cnt++;
	    }
	return ret.toString();
    }

    //indexOf(StringB str, intB fromIndex);     
    private void _stuff_into_hash(String line)
    {
	byte[] b = line.getBytes();
	StringBuffer word = new StringBuffer();
	int idx = 0;
	String key = null;

	for(int i = 0; i < b.length;i++)
	    {
		if(idx >= 5)
		    break;
		if(b[i] == (byte)'"')
		    continue; //skip quotes
		else if(b[i] == (byte)',' && idx == 0) //first word
		    {
			key = word.toString();
			((String[])(_syms.get(key)))[idx] = word.toString();
			idx++;
			word.setLength(0);
			continue;
		    }
		else if(b[i] == (byte)',')
		    {
			((String[])(_syms.get(key)))[idx] = word.toString();
			idx++;
			word.setLength(0);		
			continue;
		    }
		word.append((char)b[i]);
	    }
    }

    protected void notifyDeleted() {
    	_cl.release();
    }

    
}



More information about the java-dev mailing list