public final static String CFG_FINDER_CLASSNAME_KEY = "com.mchange.v2.c3p0.cfg.finder";
public final static String DEFAULT_CONFIG_NAME = "default";
public final static C3P0Config MAIN;
final static MLogger logger = MLog.getLogger( C3P0Config.class );
static
{
<span style="white-space:pre"> </span>C3P0Config protoMain;
<span style="white-space:pre"> </span>String cname = MultiPropertiesConfig.readVmConfig().getProperty( CFG_FINDER_CLASSNAME_KEY );
<span style="white-space:pre"> </span>C3P0ConfigFinder cfgFinder = null;
<span style="white-space:pre"> </span>try
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span>if (cname != null)
<span style="white-space:pre"> </span> cfgFinder = (C3P0ConfigFinder) Class.forName( cname ).newInstance();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>catch (Exception e)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span>if ( logger.isLoggable(MLevel.WARNING) )
<span style="white-space:pre"> </span> logger.log( MLevel.WARNING, "Could not load specified C3P0ConfigFinder class'" + cname + "'.", e);
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>try
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span>if (cfgFinder == null)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span>Class.forName("org.w3c.dom.Node");
<span style="white-space:pre"> </span>Class.forName("com.mchange.v2.c3p0.cfg.C3P0ConfigXmlUtils"); //fail nicely if we don't have XML libs
<span style="white-space:pre"> </span>cfgFinder = new DefaultC3P0ConfigFinder();
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>protoMain = cfgFinder.findConfig();
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>catch (Exception e)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>if ( logger.isLoggable(MLevel.WARNING) )
<span style="white-space:pre"> </span> logger.log( MLevel.WARNING, "XML configuration disabled! Verify that standard XML libs are available.", e);
<span style="white-space:pre"> </span>HashMap flatDefaults = C3P0ConfigUtils.extractHardcodedC3P0Defaults();
<span style="white-space:pre"> </span>flatDefaults.putAll( C3P0ConfigUtils.extractC3P0PropertiesResources() );
<span style="white-space:pre"> </span>protoMain = C3P0ConfigUtils.configFromFlatDefaults( flatDefaults );
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>MAIN = protoMain;
<span style="white-space:pre"> </span>warnOnUnknownProperties( MAIN );
}
NamedScope defaultConfig;
HashMap configNamesToNamedScopes;
C3P0Config( NamedScope defaultConfig, HashMap configNamesToNamedScopes)
{
<span style="white-space:pre"> </span>this.defaultConfig = defaultConfig;
<span style="white-space:pre"> </span>this.configNamesToNamedScopes = configNamesToNamedScopes;
}
1. MultiPropertiesConfig.readVmConfig().getProperty( CFG_FINDER_CLASSNAME_KEY );
2. MultiPropertiesConfig类
final static MultiPropertiesConfig EMPTY = new BasicMultiPropertiesConfig( new String[0] );
final static String VM_CONFIG_RSRC_PATHS = "/com/mchange/v2/cfg/vmConfigResourcePaths.txt";
static MultiPropertiesConfig vmConfig = null;
<span style="white-space:pre"> </span>List rps = new ArrayList();
<span style="white-space:pre"> </span>BufferedReader br = null;
<span style="white-space:pre"> </span>try
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span>InputStream is = MultiPropertiesConfig.class.getResourceAsStream( VM_CONFIG_RSRC_PATHS );
<span style="white-space:pre"> </span>if ( is != null )
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span>br = new BufferedReader( new InputStreamReader( is, "8859_1" ) );
<span style="white-space:pre"> </span>String rp;
<span style="white-space:pre"> </span>while ((rp = br.readLine()) != null)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span>rp = rp.trim();
<span style="white-space:pre"> </span>if ("".equals( rp ) || rp.startsWith("#"))
<span style="white-space:pre"> </span> continue;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>rps.add( rp );
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>vmConfig = new BasicMultiPropertiesConfig( (String[]) rps.toArray( new String[ rps.size() ] ) );
<span style="white-space:pre"> </span> }
#
# example file, using config files expected by various
# mchange libraries.
#
# note that later files "shadow" earlier ones, and that
# the name '/' is reserved as a special token for
# System properties.
#
/mchange-commons.properties
/mchange-log.properties
/c3p0.properties
/
根据路径读取的文件,这个文件在mchang-commons-java.jar中,类也是。
3. BasicMultiPropertiesConfig类
String[] rps;
Map propsByResourcePaths = new HashMap();
Map propsByPrefixes;
Properties propsByKey;
if ("/".equals(rp))
<span style="white-space:pre"> </span>propsByResourcePaths.put( rp, System.getProperties() );
<span style="white-space:pre"> </span>goodPaths.add( rp );
else Properties p = new Properties();
InputStream pis = MultiPropertiesConfig.class.getResourceAsStream( rp );
p.load( pis );
propsByResourcePaths.put( rp, p );
goodPaths.add( rp );
<span style="white-space:pre"> </span>this.rps = (String[]) goodPaths.toArray( new String[ goodPaths.size() ] );
<span style="white-space:pre"> </span>this.propsByPrefixes = Collections.unmodifiableMap( extractPrefixMapFromRsrcPathMap(rps, propsByResourcePaths) );
<span style="white-space:pre"> </span>this.propsByResourcePaths = Collections.unmodifiableMap( propsByResourcePaths );
<span style="white-space:pre"> </span>this.propsByKey = extractPropsByKey(rps, propsByResourcePaths);