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;
}
}