Package org.open2jam.parsers.utils

Source Code of org.open2jam.parsers.utils.KrazyRainDB$KrazyRainDBHolder

/*
* 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();
    }
}
TOP

Related Classes of org.open2jam.parsers.utils.KrazyRainDB$KrazyRainDBHolder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.