package org.chartsy.favorites.xml;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Stack;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.chartsy.main.favorites.nodes.FolderAPI;
import org.chartsy.main.favorites.nodes.RootAPI;
import org.chartsy.main.favorites.nodes.StockAPI;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
/**
*
* @author Viorel
*/
public class FavoritesXmlHandler extends DefaultHandler
{
private static final int FAVORITES = "favorites".hashCode();
private static final int FOLDER = "folder".hashCode();
private static final int NAME = "name".hashCode();
private static final int STOCK = "stock".hashCode();
private static final int COMPANY = "companyName".hashCode();
private static final int SYMBOL = "symbol".hashCode();
private static final int EXCHANGE = "exchange".hashCode();
private static final int DATAPROVIDER = "dataProvider".hashCode();
private RootAPI root;
private Stack stack;
private boolean isStackReadyForText;
private boolean isInsideFolder;
public FavoritesXmlHandler()
{
stack = new Stack();
isStackReadyForText = false;
isInsideFolder = false;
}
public RootAPI getRootAPI()
{
return root;
}
public @Override void startElement
(String uri, String localName, String qName, Attributes attribs)
{
isStackReadyForText = false;
int identifier = localName.hashCode();
if (identifier == FAVORITES)
{
stack.push(new RootAPI());
isInsideFolder = false;
}
else if(identifier == FOLDER)
{
stack.push(new FolderAPI());
isInsideFolder = true;
}
else if(identifier == STOCK)
stack.push(new StockAPI());
else if (identifier == NAME
|| identifier == COMPANY
|| identifier == SYMBOL
|| identifier == EXCHANGE
|| identifier == DATAPROVIDER)
{
stack.push(new StringBuilder());
isStackReadyForText = true;
}
else
{
// do nothing
}
}
public @Override void endElement
(String uri, String localName, String qName)
{
isStackReadyForText = false;
Object tmp = stack.pop();
int identifier = localName.hashCode();
if (identifier == FAVORITES)
root = (RootAPI) tmp;
else if(identifier == FOLDER)
{
((RootAPI) stack.peek()).addFolder((FolderAPI) tmp);
isInsideFolder = false;
}
else if(identifier == STOCK)
{
if (isInsideFolder)
((FolderAPI)stack.peek()).addStock((StockAPI) tmp);
else
((RootAPI)stack.peek()).addStock((StockAPI) tmp);
}
else if (identifier == NAME)
((FolderAPI)stack.peek()).setDisplayName(decode(tmp.toString()));
else if (identifier == COMPANY)
((StockAPI)stack.peek()).setCompanyName(decode(tmp.toString()));
else if (identifier == SYMBOL)
((StockAPI)stack.peek()).setSymbol(decode(tmp.toString()));
else if (identifier == EXCHANGE)
((StockAPI)stack.peek()).setExchange(decode(tmp.toString()));
else if (identifier == DATAPROVIDER)
((StockAPI)stack.peek()).setDataProviderName(decode(tmp.toString()));
else
stack.push(tmp);
}
public @Override void characters
(char[] data, int start, int length)
{
if (isStackReadyForText == true)
{
((StringBuilder)stack.peek()).append(data, start, length);
}
}
private String decode(String text)
{
try
{
return URLDecoder.decode(text, "UTF-8");
}
catch (UnsupportedEncodingException ex)
{
Logger.getLogger(FavoritesXmlHandler.class.getName()).log(Level.SEVERE, "", ex);
}
return text;
}
}