iBATIS3(mybatis) Configuration.xml を読む

iBATIS3(mybatis) Configration.xml で定義された Enviromomet をリストで取得するようなものを
探していたが見つからない。
しかたなく、XML読んで名前だけ取得するものを作った。
なぜなら、複数DB接続を制御したいからだ。

http://blog.zaq.ne.jp/oboe2uran/article/264/
これを利用して作る。

インターフェースを次のように用意

import java.util.List;
/**
 * Configration.xml Parser
 */

interface ConfigurationParser{
   String getDefaultEnviroment();
   List<String> getEnviromentNames();
}

次に、AbstractXmlHandler の実装を、

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import jp.jsuite.util.xml.AbstractXmlHandler;
/**
 * Configration.xml XML parse Handler
 */

class ConfigHandler extends AbstractXmlHandler<ConfigurationParser>{
   private Stack<String> stack;
   String defaultEnviroment;
   List<String> enviromentlist;

   /*
    * @see AbstractXmlHandler#result()
    */

   @Override
   public ConfigurationParser result() throws Exception{
      return new ConfigurationParser(){
         @Override
         public String getDefaultEnviroment(){
            return ConfigHandler.this.defaultEnviroment;
         }
         @Override
         public List<String> getEnviromentNames(){
            return ConfigHandler.this.enviromentlist;
         }
      };
   }

   @Override
   public void startElement(String uri,String localName,String name,Attributes attributes)
  throws SAXException{
      this.stack.push(name);;
      StringBuilder sb = new StringBuilder();
      for(String s : this.stack){
         sb.append("/"+s);
      }
      String xpath = sb.toString();
      if ("/configuration/environments".equals(xpath)){
         int length = attributes.getLength();
         for(int i=0;i < length;i++){
            if (attributes.getQName(i).equals("default")){
               this.defaultEnviroment = attributes.getValue(i);
            }
         }
      }else if("/configuration/environments/environment".equals(xpath)){
         int length = attributes.getLength();
         for(int i=0;i < length;i++){
            if (attributes.getQName(i).equals("id")) this.enviromentlist.add(attributes.getValue(i));
         }
      }
   }

   @Override
   public void endElement(String uri,String localName,String name) throws SAXException{
      this.stack.pop();
   }
   @Override
   public void startDocument() throws SAXException{
      this.stack = new Stack<String>();
      this.enviromentlist = new ArrayList<String>();
   }
   @Override
   public void endDocument() throws SAXException{
   }
}

そして詠み込みはシングルトンで実行したい

import java.util.ArrayList;
import java.util.List;
import jp.jsuite.util.xml.AbstractXmlHandler;
import jp.jsuite.util.xml.XmlParser;
/**
 * Configuration.xml spi
 * for get enviromtent name
 */

public final class SpiConfiguration{
   private static SpiConfiguration inst;
   private ConfigurationParser parser;

   @SuppressWarnings("unchecked")
   private SpiConfiguration(){
      XmlParser<ConfigurationParser> xmlparser = AbstractXmlHandler.createParser("Configuration",new ConfigHandler());
      try{
      this.parser = xmlparser.parse();
      }catch(Exception e){
         throw new RuntimeException("Configuration.xml parse Error : "+e.getMessage(),e);
      }
   }
   public final static synchronized SpiConfiguration getInstance(){
      if (inst==null) inst = new SpiConfiguration();
      return inst;
   }

   public String getDefaultEnviroment(){
      return this.parser.getDefaultEnviroment();
   }
   public List<String> enviromentNames(){
      return this.parser.getEnviromentNames();
   }

   public boolean isDefault(String name){
      return this.parser.getDefaultEnviroment().equals(name);
   }
   public List<String> speifyNames(){
      List<String> list = new ArrayList<String>();
      for(String s : this.parser.getEnviromentNames()){
         if (!s.equals(this.parser.getDefaultEnviroment())){
            list.add(s);
         }
      }
      return list;
   }
}