/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.open2jam.parsers.utils; import java.io.IOException; import java.net.URL; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import org.open2jam.parsers.XNTChart; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * * @author CdK */ public class KrazyRainDB extends DefaultHandler { private static final URL resources_xml = KrazyRainDB.class.getResource("/resources/KrazyRain.xml"); private enum Keyword { MusicInfo, Music, Note, Compressor } private ArrayDeque<Keyword> call_stack; private ArrayDeque<Map<String,String>> atts_stack; private HashMap<String,ArrayList<XNTChart>> chart_map; private ArrayList<XNTChart> charts; private KrazyRainDB() { call_stack = new ArrayDeque<Keyword>(); atts_stack = new ArrayDeque<Map<String,String>>(); chart_map = new HashMap<String, ArrayList<XNTChart>>(); charts = new ArrayList<XNTChart>(); load(); } public static KrazyRainDB getInstance() { return KrazyRainDBHolder.INSTANCE; } public ArrayList<XNTChart> getCharts(String filename) { if(chart_map.containsKey(filename)) return chart_map.get(filename); Logger.global.log(Level.WARNING, "Can''t find a KrazyRain chartList with the id {0}", filename); return null; } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { HashMap<String,String> atts_map = new HashMap<String,String>(atts.getLength()); for(int i=0;i<atts.getLength();i++) atts_map.put(atts.getQName(i), atts.getValue(i)); Keyword k = getKeyword(qName); call_stack.push(k); atts_stack.push(atts_map); switch(k) { case Music: charts = new ArrayList<XNTChart>(); break; case Note: XNTChart c = new XNTChart(); if(atts_map.containsKey("level")) c.setLevel(Integer.parseInt(atts_map.get("level"))); if(atts_map.containsKey("key")) c.setKeys(Integer.parseInt(atts_map.get("key"))); if(atts_map.containsKey("note")) c.setNoteCount(Integer.parseInt(atts_map.get("note"))); if(atts_map.containsKey("xnt_file")) c.setXNTFile(atts_map.get("xnt_file")); if(atts_map.containsKey("xne_file")) c.setXNEFile(atts_map.get("xne_file")); charts.add(c); break; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { Keyword k = call_stack.pop(); Map<String,String> atts = atts_stack.pop(); switch(k) { case Music: String filename = ""; String title = ""; String genre = ""; String artist = ""; String noter = ""; double bpm = 130d; int duration = 0; if(atts.containsKey("id")) filename = "C"+atts.get("id")+".snp"; if(atts.containsKey("path")) filename = atts.get("path")+".snp"; if(atts.containsKey("title")) title = atts.get("title"); //TODO maybe just genre? genre_sub is more specific if(atts.containsKey("genre_sub")) genre = atts.get("genre_sub"); if(atts.containsKey("bpm")) bpm = Double.parseDouble(atts.get("bpm")); if(atts.containsKey("Composer")) artist = atts.get("Composer"); if(atts.containsKey("Pattern")) noter = atts.get("Pattern"); if(atts.containsKey("playtime")) { String[] t = atts.get("playtime").split(":"); duration = Integer.parseInt(t[0]) * 60 + Integer.parseInt(t[1]); } for(XNTChart c : charts) { c.setTitle(title); c.setArtist(artist); c.setBPM(bpm); c.setDuration(duration); c.setGenre(genre); c.setNoter(noter); } filename = filename.toUpperCase(); if(chart_map.containsKey(filename)) charts.addAll(chart_map.get(filename)); chart_map.put(filename, charts); break; } } private Keyword getKeyword(String s) { try{ return Keyword.valueOf(s); }catch(IllegalArgumentException e){ Logger.global.log(Level.WARNING, "Unknown keyword [{0}] in resources.xml.", s); } return null; } private void load() { try { try { SAXParserFactory.newInstance().newSAXParser().parse(resources_xml.openStream(), this); } catch (ParserConfigurationException ex) { java.util.logging.Logger.getLogger(KrazyRainDB.class.getName()).log(Level.SEVERE, "{0}", ex); } } catch (SAXException ex) { java.util.logging.Logger.getLogger(KrazyRainDB.class.getName()).log(Level.SEVERE, "{0}", ex); } catch (IOException ex) { java.util.logging.Logger.getLogger(KrazyRainDB.class.getName()).log(Level.SEVERE, "{0}", ex); } } private static class KrazyRainDBHolder { private static final KrazyRainDB INSTANCE = new KrazyRainDB(); } }