0,0 → 1,182 |
package ak.hostadmiral.core.config; |
|
import java.util.Iterator; |
import java.util.Map; |
import java.util.HashMap; |
import java.io.IOException; |
import java.io.InputStream; |
import org.xml.sax.SAXException; |
|
import org.apache.log4j.Logger; |
import org.apache.commons.digester.Digester; |
import org.hibernate.HibernateException; |
|
import ak.hostadmiral.util.ConfigInit; |
import ak.hostadmiral.util.ModelException; |
import ak.hostadmiral.util.hibernate.HibernateUtil; |
import ak.hostadmiral.core.model.*; |
|
public class Configurator |
{ |
public static final int CONFIG_VERSION = 1; |
|
private static final Logger logger = Logger.getLogger(Configurator.class); |
|
private InputStream defaultStream; |
private InputStream userStream; |
|
public void setDefaultStream(InputStream defaultStream) |
{ |
this.defaultStream = defaultStream; |
} |
|
public void setUserStream(InputStream userStream) |
{ |
this.userStream = userStream; |
} |
|
private void checkConfigVersion(String name, ConfigRoot config) |
throws ModelException |
{ |
if(config.getVersionMajor() == 0) |
throw new ModelException("Cannot get version of " + name + " config"); |
|
if(config.getVersionMajor() != CONFIG_VERSION) |
throw new ModelException("Version " + CONFIG_VERSION + " of " + name |
+ " config is required but " + config.getVersionMajor() + " found"); |
} |
|
public void configure() |
throws ModelException |
{ |
ConfigRoot config; |
try { |
// get config |
ConfigRoot defaultConfig = readConfig(defaultStream); |
logger.debug("default:\n" + defaultConfig); |
checkConfigVersion("default", defaultConfig); |
|
ConfigRoot userConfig = readConfig(userStream); |
logger.debug("user:\n" + userConfig); |
checkConfigVersion("user", userConfig); |
|
config = defaultConfig.merge(userConfig); |
logger.info("result config:\n" + config); |
} |
catch(Exception ex) { |
throw new ModelException("Cannot read config: " + ex); |
} |
|
// init data source |
ConfigDataSource cs = config.getDataSource(); |
try { |
HibernateUtil.configure(cs.getDriver(), cs.getUserName(), cs.getPassword(), |
cs.getUrl(), cs.getDialect()); |
} |
catch(HibernateException ex) { |
throw new ModelException("Cannot init data source: " + ex); |
} |
|
// init classes |
for(Iterator i = config.getInitialization().iterator(); i.hasNext(); ) { |
ConfigInitialization ci = (ConfigInitialization)i.next(); |
|
if(ci.getIgnore()) continue; |
|
// get class |
Class c = null; |
try { |
c = Class.forName(ci.getClassName()); |
} |
catch(ClassCastException ex) { |
logger.error("Class " + ci.getClassName() + " has wrong type", ex); |
} |
catch(Exception ex) { |
logger.error("Cannot get class " + ci.getClassName(), ex); |
} |
if(c == null) continue; |
|
if(ConfigInit.class.isAssignableFrom(c)) { |
ConfigInit o = null; |
try { |
o = (ConfigInit)c.newInstance(); |
} |
catch(Exception ex) { |
logger.error("Cannot get instance of class " + c.getClass().getName(), ex); |
} |
if(o == null) continue; |
|
Map params = new HashMap(); |
for(Iterator j = ci.getInitParam().iterator(); j.hasNext(); ) { |
ConfigInitParam p = (ConfigInitParam)j.next(); |
params.put(p.getName(), (String[])p.getValues().toArray(new String[0])); |
} |
|
try { |
o.init(params); |
} |
catch(ModelException ex) { |
logger.error("Cannot initialize instance of class " |
+ c.getClass().getName(), ex); |
} |
} |
else { |
logger.error("Class " + c.getClass().getName() |
+ " does not implement ak.hostadmiral.util.ConfigInit interface"); |
} |
} |
} |
|
private ConfigRoot readConfig(InputStream in) |
throws IOException, SAXException |
{ |
return (ConfigRoot)createDigester().parse(in); |
} |
|
private Digester createDigester() |
{ |
Digester digester = new Digester(); |
digester.setValidating(false); |
|
digester.addObjectCreate("hostadmiral", ConfigRoot.class); |
digester.addSetProperties("hostadmiral/version", "major", "versionMajor"); |
digester.addSetProperties("hostadmiral/version", "minor", "versionMinor"); |
|
digester.addObjectCreate("hostadmiral/datasource", ConfigDataSource.class); |
digester.addBeanPropertySetter("hostadmiral/datasource/type", "type"); |
digester.addBeanPropertySetter("hostadmiral/datasource/settings/driver", "driver"); |
digester.addBeanPropertySetter("hostadmiral/datasource/settings/username", "userName"); |
digester.addBeanPropertySetter("hostadmiral/datasource/settings/password", "password"); |
digester.addBeanPropertySetter("hostadmiral/datasource/settings/url", "url"); |
digester.addBeanPropertySetter("hostadmiral/datasource/settings/dialect", "dialect"); |
digester.addSetNext("hostadmiral/datasource", "setDataSource"); |
|
digester.addObjectCreate("hostadmiral/initializations/initialization", |
ConfigInitialization.class); |
digester.addBeanPropertySetter("hostadmiral/initializations/initialization/class", |
"className"); |
digester.addBeanPropertySetter("hostadmiral/initializations/initialization/ignore", |
"ignore"); |
digester.addSetNext("hostadmiral/initializations/initialization", "addInitialization"); |
|
digester.addObjectCreate("hostadmiral/initializations/initialization/init-param", |
ConfigInitParam.class); |
digester.addBeanPropertySetter( |
"hostadmiral/initializations/initialization/init-param/param-name", "name"); |
digester.addBeanPropertySetter( |
"hostadmiral/initializations/initialization/init-param/param-value", "value"); |
digester.addSetNext("hostadmiral/initializations/initialization/init-param", |
"addInitParam"); |
|
return digester; |
} |
|
private static Configurator configurator; |
|
public static Configurator getInstance() |
{ |
if(configurator == null) configurator = new Configurator(); |
|
return configurator; |
} |
} |