/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/config/Configurator.java |
---|
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; |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/config/ConfigInitParam.java |
---|
0,0 → 1,43 |
package ak.hostadmiral.core.config; |
import java.util.Iterator; |
import java.util.List; |
import java.util.ArrayList; |
public class ConfigInitParam |
{ |
private String name; |
private List values = new ArrayList(); |
public String getName() |
{ |
return name; |
} |
public void setName(String name) |
{ |
this.name = name; |
} |
public List getValues() |
{ |
return values; |
} |
public void setValue(String value) |
{ |
values.add(value); |
} |
public String toString() |
{ |
StringBuffer valuesStr = new StringBuffer(); |
for(Iterator i = values.iterator(); i.hasNext(); ) { |
String s = (String)i.next(); |
if(valuesStr.length() > 0) valuesStr.append(";\n\t\t\t\t"); |
valuesStr.append(s); |
} |
return "\t\t\t" + name + "=" + valuesStr + "\n"; |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/config/ConfigRoot.java |
---|
0,0 → 1,87 |
package ak.hostadmiral.core.config; |
import java.util.List; |
import java.util.ArrayList; |
import java.util.Iterator; |
import ak.hostadmiral.util.ModelException; |
public class ConfigRoot |
{ |
private int versionMajor; |
private int versionMinor; |
private ConfigDataSource dataSource; |
private List initializations = new ArrayList(); // List(ConfigInitialization) |
public int getVersionMajor() |
{ |
return versionMajor; |
} |
public void setMajor(String major) |
{ |
this.versionMajor = Integer.parseInt(major); |
} |
public int getVersionMinor() |
{ |
return versionMinor; |
} |
public void setMinor(String minor) |
{ |
this.versionMinor = Integer.parseInt(minor); |
} |
public ConfigDataSource getDataSource() |
{ |
return dataSource; |
} |
public void setDataSource(ConfigDataSource dataSource) |
{ |
this.dataSource = dataSource; |
} |
public List getInitialization() |
{ |
return initializations; |
} |
public void addInitialization(ConfigInitialization initialization) |
{ |
initializations.add(initialization); |
} |
public ConfigRoot merge(ConfigRoot second) |
throws ModelException |
{ |
if(second == null) return this; |
if(this.versionMajor != second.versionMajor) |
throw new ModelException("First config has version " + this.versionMajor |
+ ", second - " + second.versionMajor); |
this.dataSource = dataSource.merge(second.dataSource); |
for(Iterator i = second.initializations.iterator(); i.hasNext(); ) { |
ConfigInitialization ci = (ConfigInitialization)i.next(); |
this.initializations.remove(ci); |
this.initializations.add(ci); |
} |
return this; |
} |
public String toString() |
{ |
StringBuffer initStr = new StringBuffer(); |
for(Iterator i = initializations.iterator(); i.hasNext(); ) { |
ConfigInitialization ci = (ConfigInitialization)i.next(); |
initStr.append(ci); |
} |
return "hostadmiral config v" + versionMajor + "." + versionMinor + "\n" |
+ dataSource + "\n\tinitializations:\n" + initStr.toString() + "end of config"; |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/config/ConfigInitialization.java |
---|
0,0 → 1,77 |
package ak.hostadmiral.core.config; |
import java.util.List; |
import java.util.Iterator; |
import java.util.ArrayList; |
public class ConfigInitialization |
{ |
private String className; |
private boolean ignore = false; |
private List params = new ArrayList(); // List(ConfigInitParam) |
public String getClassName() |
{ |
return className; |
} |
public void setClassName(String className) |
{ |
this.className = className; |
} |
public boolean getIgnore() |
{ |
return ignore; |
} |
public void setIgnore(boolean ignore) |
{ |
this.ignore = ignore; |
} |
public void setIgnore(String ignore) |
{ |
this.ignore = Boolean.valueOf(ignore).booleanValue(); |
} |
public List getInitParam() |
{ |
return params; |
} |
public void addInitParam(ConfigInitParam param) |
{ |
params.add(param); |
} |
public boolean equals(Object obj) |
{ |
if(!(obj instanceof ConfigInitialization)) return false; |
ConfigInitialization second = (ConfigInitialization)obj; |
return (this.className != null && second.className != null |
&& this.className.equals(second.className)); |
} |
public int hashCode() |
{ |
if(className == null) |
return 0; |
else |
return className.hashCode(); |
} |
public String toString() |
{ |
StringBuffer paramsStr = new StringBuffer(); |
for(Iterator i = params.iterator(); i.hasNext(); ) { |
ConfigInitParam p = (ConfigInitParam)i.next(); |
paramsStr.append(p); |
} |
return "\t\t" + className + (ignore ? " (ignore)" : "") + ":\n" |
+ paramsStr.toString() + "\n"; |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/config/ConfigDataSource.java |
---|
0,0 → 1,96 |
package ak.hostadmiral.core.config; |
public class ConfigDataSource |
{ |
private String type; |
private String driver; |
private String userName; |
private String password; |
private String url; |
private String dialect; |
public String getType() |
{ |
return type; |
} |
public void setType(String type) |
{ |
this.type = type; |
} |
public String getDriver() |
{ |
return driver; |
} |
public void setDriver(String driver) |
{ |
this.driver = driver; |
} |
public String getUserName() |
{ |
return userName; |
} |
public void setUserName(String userName) |
{ |
this.userName = userName; |
} |
public String getPassword() |
{ |
return password; |
} |
public void setPassword(String password) |
{ |
this.password = password; |
} |
public String getUrl() |
{ |
return url; |
} |
public void setUrl(String url) |
{ |
this.url = url; |
} |
public String getDialect() |
{ |
return dialect; |
} |
public void setDialect(String dialect) |
{ |
this.dialect = dialect; |
} |
public ConfigDataSource merge(ConfigDataSource second) |
{ |
if(second == null) return this; |
if(second.type != null) this.type = second.type; |
if(second.driver != null) this.driver = second.driver; |
if(second.userName != null) this.userName = second.userName; |
if(second.password != null) this.password = second.password; |
if(second.url != null) this.url = second.url; |
if(second.dialect != null) this.dialect = second.dialect; |
return this; |
} |
public String toString() |
{ |
return "\tdata source: " + type + "\n" |
+ "\t\tdriver: " + driver + "\n" |
+ "\t\tuserName: " + userName + "\n" |
+ "\t\tpassword: " |
+ ((password == null || password.equals("")) ? "(not set)" : "(set)") + "\n" |
+ "\t\turl: " + url + "\n" |
+ "\t\tdialect: " + dialect + "\n"; |
} |
} |