//# 1 errors, 278 messages
//#
/*
    //#DatabaseProvider.java:1:1: class: org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType
    //#DatabaseProvider.java:1:1: class: org.apache.roller.weblogger.business.DatabaseProvider
 * Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  The ASF licenses this file to You
 * under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */

package org.apache.roller.weblogger.business;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.startup.StartupException;
import org.apache.roller.weblogger.config.WebloggerConfig;


/**
 * Encapsulates Roller database configuration via JDBC properties or JNDI.
 * 
 * <p>To keep the logs from filling up with DB connection errors, will only 
 * attempt to connect once.</p>
 * 
 * <p>Keeps startup exception and log so we can present useful debugging
 * information to whoever is installing Roller.</p>
 * 
 * 
 * <p>Reads configuration properties from WebloggerConfig:</p>
 * <pre>
 * # Specify database configuration type of 'jndi' or 'jdbc'
 * database.configurationType=jndi
 * 
 * # For database configuration type 'jndi',this will be used
 * database.jndi.name=jdbc/rollerdb
 * 
 * # For database configuration type of 'jdbc', you MUST override these
 * database.jdbc.driverClass=
 * database.jdbc.connectionURL=
 * database.jdbc.username=
 * database.jdbc.password=
 * </pre>
 */
public class DatabaseProvider  {
    
    private static Log log = LogFactory.getLog(DatabaseProvider.class);
    //#DatabaseProvider.java:64: method: org.apache.roller.weblogger.business.DatabaseProvider.org.apache.roller.weblogger.business.DatabaseProvider__static_init
    //#DatabaseProvider.java:64: Warning: method not available
    //#    -- call on Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.DatabaseProvider
    //#    method: org.apache.roller.weblogger.business.DatabaseProvider__static_init
    //#    unanalyzed callee: Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Descendant_Table[org/apache/roller/weblogger/business/DatabaseProvider]
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.errorMessage(Ljava/lang/String;)V
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getConnection()Ljava/sql/Connection;
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJdbcConnectionURL()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJdbcDriverClass()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJdbcPassword()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJdbcUsername()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJndiName()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getStartupLog()Ljava/util/List;
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getType()Lorg/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType;
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.successMessage(Ljava/lang/String;)V
    //#output(org.apache.roller.weblogger.business.DatabaseProvider__static_init): log
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Descendant_Table[org/apache/roller/weblogger/business/DatabaseProvider] == &__Dispatch_Table
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.errorMessage(Ljava/lang/String;)V == &errorMessage
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getConnection()Ljava/sql/Connection; == &getConnection
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJdbcConnectionURL()Ljava/lang/String; == &getJdbcConnectionURL
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJdbcDriverClass()Ljava/lang/String; == &getJdbcDriverClass
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJdbcPassword()Ljava/lang/String; == &getJdbcPassword
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJdbcUsername()Ljava/lang/String; == &getJdbcUsername
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getJndiName()Ljava/lang/String; == &getJndiName
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getStartupLog()Ljava/util/List; == &getStartupLog
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.getType()Lorg/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType; == &getType
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): __Dispatch_Table.successMessage(Ljava/lang/String;)V == &successMessage
    //#post(org.apache.roller.weblogger.business.DatabaseProvider__static_init): init'ed(log)
    //#DatabaseProvider.java:64: end of method: org.apache.roller.weblogger.business.DatabaseProvider.org.apache.roller.weblogger.business.DatabaseProvider__static_init

    public enum ConfigurationType {JNDI_NAME, JDBC_PROPERTIES;}
    //#DatabaseProvider.java:66: method: DatabaseProvider$ConfigurationType[] org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType.values()
    //#input(DatabaseProvider$ConfigurationType[] values()): $VALUES
    //#input(DatabaseProvider$ConfigurationType[] values()): $VALUES.length
    //#input(DatabaseProvider$ConfigurationType[] values()): $VALUES[0..2]
    //#output(DatabaseProvider$ConfigurationType[] values()): new DatabaseProvider$ConfigurationType[](values#1) num objects
    //#output(DatabaseProvider$ConfigurationType[] values()): return_value.length
    //#output(DatabaseProvider$ConfigurationType[] values()): return_value[0..2]
    //#output(DatabaseProvider$ConfigurationType[] values()): return_value
    //#new obj(DatabaseProvider$ConfigurationType[] values()): new DatabaseProvider$ConfigurationType[](values#1)
    //#pre[1] (DatabaseProvider$ConfigurationType[] values()): (soft) init'ed($VALUES[0..2])
    //#post(DatabaseProvider$ConfigurationType[] values()): return_value == &new DatabaseProvider$ConfigurationType[](values#1)
    //#post(DatabaseProvider$ConfigurationType[] values()): new DatabaseProvider$ConfigurationType[](values#1) num objects == 1
    //#post(DatabaseProvider$ConfigurationType[] values()): return_value.length == 2
    //#post(DatabaseProvider$ConfigurationType[] values()): return_value[0..2] == One-of{$VALUES[0..2], undefined}
    //#DatabaseProvider.java:66: end of method: DatabaseProvider$ConfigurationType[] org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType.values()
    //#DatabaseProvider.java:66: method: DatabaseProvider$ConfigurationType org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType.valueOf(String)
    //#input(DatabaseProvider$ConfigurationType valueOf(String)): __Descendant_Table[org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType]
    //#input(DatabaseProvider$ConfigurationType valueOf(String)): __Descendant_Table[others]
    //#input(DatabaseProvider$ConfigurationType valueOf(String)): name
    //#output(DatabaseProvider$ConfigurationType valueOf(String)): return_value
    //#presumption(DatabaseProvider$ConfigurationType valueOf(String)): java.lang.Enum:valueOf(...).__Tag@66 == org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType
    //#post(DatabaseProvider$ConfigurationType valueOf(String)): init'ed(return_value)
    //#DatabaseProvider.java:66: end of method: DatabaseProvider$ConfigurationType org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType.valueOf(String)
    //#DatabaseProvider.java:66: method: void org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType.org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType(String, int)
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType(String, int)): Param_1
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType(String, int)): Param_2
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType(String, int)): this
    //#DatabaseProvider.java:66: end of method: void org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType.org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType(String, int)
    //#DatabaseProvider.java:66: method: org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType.org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): $VALUES
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): JDBC_PROPERTIES
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): JNDI_NAME
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): __Descendant_Table[org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType]
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#1) num objects
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): JNDI_NAME.__Tag
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#2) num objects
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): JDBC_PROPERTIES.__Tag
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType[](DatabaseProvider$ConfigurationType__static_init#3) num objects
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): $VALUES.length
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): $VALUES[0]
    //#output(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): $VALUES[1]
    //#new obj(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#1)
    //#new obj(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#2)
    //#new obj(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType[](DatabaseProvider$ConfigurationType__static_init#3)
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): $VALUES == &new DatabaseProvider$ConfigurationType[](DatabaseProvider$ConfigurationType__static_init#3)
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): JDBC_PROPERTIES == &new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#2)
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): $VALUES[1] == &new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#2)
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): JNDI_NAME == &new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#1)
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): $VALUES[0] == &new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#1)
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): __Descendant_Table[org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType] == &__Dispatch_Table
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#1) num objects == 1
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#2) num objects == 1
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): new DatabaseProvider$ConfigurationType[](DatabaseProvider$ConfigurationType__static_init#3) num objects == 1
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): JNDI_NAME.__Tag == org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): JDBC_PROPERTIES.__Tag == org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType
    //#post(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): $VALUES.length == 2
    //#unanalyzed(org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init): Effects-of-calling:java.lang.Enum
    //#DatabaseProvider.java:66: end of method: org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType.org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init
    private ConfigurationType type = ConfigurationType.JNDI_NAME;
    private List<String> startupLog = new ArrayList<String>();
    
    private DataSource dataSource = null;    
    private String jndiName = null; 
    
    private String jdbcDriverClass = null;
    private String jdbcConnectionURL = null;
    private String jdbcPassword = null;
    private String jdbcUsername = null;
    private Properties props = null;
    
    
    /**
     * Reads configuraiton, loads driver or locates data-source and attempts
     * to get test connecton so that we can fail early.
     */ 
    public DatabaseProvider() throws StartupException {
    //#DatabaseProvider.java:84: method: void org.apache.roller.weblogger.business.DatabaseProvider.org.apache.roller.weblogger.business.DatabaseProvider()
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "-- Using JDBC connection URL: "._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "-- Using JDBC driver class: "._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "-- Using JDBC username: "._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "-- Using JNDI datasource name: "._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "="._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "ERROR: cannot load JDBC driver class ["._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "ERROR: cannot locate JNDI DataSource ["._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "Fetching property ["._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "Likely problem: JDBC driver jar missing from server classpath."._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "Likely problem: no DataSource or datasource is misconfigured."._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "SUCCESS: Got parameters. Using configuration type "._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "SUCCESS: loaded JDBC driver class ["._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "SUCCESS: located JNDI DataSource ["._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "]"._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "]. "._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "database.configurationType"._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "database.jdbc.connectionURL"._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "database.jdbc.driverClass"._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "database.jdbc.password"._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "database.jdbc.username"._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "database.jndi.name"._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): "java:comp.env."._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Descendant_Table[org/apache/roller/weblogger/business/DatabaseProvider]
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Descendant_Table[others]
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Dispatch_Table.getConnection()Ljava/sql/Connection;
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Dispatch_Table.getJdbcConnectionURL()Ljava/lang/String;
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Dispatch_Table.getJdbcDriverClass()Ljava/lang/String;
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Dispatch_Table.getJdbcPassword()Ljava/lang/String;
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Dispatch_Table.getJdbcUsername()Ljava/lang/String;
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Dispatch_Table.getJndiName()Ljava/lang/String;
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): __Dispatch_Table.getType()Lorg/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType;
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): log
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init.new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#1)._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init.new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#2)._tainted
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType.JDBC_PROPERTIES
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType.JNDI_NAME
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): org/apache/roller/weblogger/business/startup/StartupException.java.util.Collections.EMPTY_LIST
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): org/apache/roller/weblogger/config/WebloggerConfig.config
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): org/apache/roller/weblogger/config/WebloggerConfig.log
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): this
    //#input(void org.apache.roller.weblogger.business.DatabaseProvider()): this.__Tag
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): new ArrayList(DatabaseProvider#1) num objects
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): new Properties(DatabaseProvider#9) num objects
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): new Properties(DatabaseProvider#9)._tainted
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.__Tag
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.dataSource
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.jdbcConnectionURL
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.jdbcDriverClass
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.jdbcPassword
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.jdbcUsername
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.jndiName
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.props
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.startupLog
    //#output(void org.apache.roller.weblogger.business.DatabaseProvider()): this.type
    //#new obj(void org.apache.roller.weblogger.business.DatabaseProvider()): new ArrayList(DatabaseProvider#1)
    //#new obj(void org.apache.roller.weblogger.business.DatabaseProvider()): new Properties(DatabaseProvider#9)
    //#pre[1] (void org.apache.roller.weblogger.business.DatabaseProvider()): log != null
    //#pre[2] (void org.apache.roller.weblogger.business.DatabaseProvider()): this.__Tag == org/apache/roller/weblogger/business/DatabaseProvider
    //#pre[5] (void org.apache.roller.weblogger.business.DatabaseProvider()): org/apache/roller/weblogger/config/WebloggerConfig.config != null
    //#pre[6] (void org.apache.roller.weblogger.business.DatabaseProvider()): org/apache/roller/weblogger/config/WebloggerConfig.log != null
    //#presumption(void org.apache.roller.weblogger.business.DatabaseProvider()): javax.naming.InitialContext:lookup(...)@128 != null
    //#presumption(void org.apache.roller.weblogger.business.DatabaseProvider()): this.dataSource != null
    //#presumption(void org.apache.roller.weblogger.business.DatabaseProvider()): this.props != null
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): this.__Tag == org/apache/roller/weblogger/business/DatabaseProvider
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): (soft) this.dataSource != null
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): init'ed(this.jdbcConnectionURL)
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): init'ed(this.jdbcDriverClass)
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): init'ed(this.jdbcPassword)
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): init'ed(this.jdbcUsername)
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): init'ed(this.jndiName)
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): (soft) this.props != null
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): this.startupLog == &new ArrayList(DatabaseProvider#1)
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): this.type in Addr_Set{&org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init.new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#1),&org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType__static_init.new DatabaseProvider$ConfigurationType(DatabaseProvider$ConfigurationType__static_init#2)}
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): new ArrayList(DatabaseProvider#1) num objects == 1
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): new Properties(DatabaseProvider#9) num objects <= 1
    //#post(void org.apache.roller.weblogger.business.DatabaseProvider()): new Properties(DatabaseProvider#9)._tainted == 0
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:org.apache.commons.logging.Log:info
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:java.sql.DriverManager:getConnection
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:javax.sql.DataSource:getConnection
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:java.util.Properties:getProperty
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:org.apache.roller.weblogger.WebloggerException
    //#unanalyzed(void org.apache.roller.weblogger.business.DatabaseProvider()): Effects-of-calling:org.apache.roller.RollerException
    //#test_vector(void org.apache.roller.weblogger.business.DatabaseProvider()): java.lang.String:equals(...)@88: {0}, {1}
        
        String connectionTypeString = 
                WebloggerConfig.getProperty("database.configurationType"); 
        if ("jdbc".equals(connectionTypeString)) {
            type = ConfigurationType.JDBC_PROPERTIES;
        }
        jndiName =          WebloggerConfig.getProperty("database.jndi.name");
        jdbcDriverClass =   WebloggerConfig.getProperty("database.jdbc.driverClass");
        jdbcConnectionURL = WebloggerConfig.getProperty("database.jdbc.connectionURL");
        jdbcUsername =      WebloggerConfig.getProperty("database.jdbc.username");
        jdbcPassword =      WebloggerConfig.getProperty("database.jdbc.password");
        
        successMessage("SUCCESS: Got parameters. Using configuration type " + type);

        // If we're doing JDBC then attempt to load JDBC driver class
        if (getType() == ConfigurationType.JDBC_PROPERTIES) {
            successMessage("-- Using JDBC driver class: "   + jdbcDriverClass);
            successMessage("-- Using JDBC connection URL: " + jdbcConnectionURL);
            successMessage("-- Using JDBC username: "       + jdbcUsername);
            successMessage("-- Using JDBC password: [hidden]");
            try {
                Class.forName(getJdbcDriverClass());
            } catch (ClassNotFoundException ex) {
                String errorMsg = 
                     "ERROR: cannot load JDBC driver class [" + getJdbcDriverClass()+ "]. "
                    +"Likely problem: JDBC driver jar missing from server classpath.";
                errorMessage(errorMsg);
                throw new StartupException(errorMsg, ex, startupLog);
            }
            successMessage("SUCCESS: loaded JDBC driver class [" +getJdbcDriverClass()+ "]");
            
            if (getJdbcUsername() != null || getJdbcPassword() != null) {
                props = new Properties();
                if (getJdbcUsername() != null) props.put("user", getJdbcUsername());
                if (getJdbcPassword() != null) props.put("password", getJdbcPassword());
            }
            
        // Else attempt to locate JNDI datasource
        } else { 
            String name = "java:comp/env/" + getJndiName();
            successMessage("-- Using JNDI datasource name: " + name);
            try {
                InitialContext ic = new InitialContext();
                dataSource = (DataSource)ic.lookup(name);
            } catch (NamingException ex) {
                String errorMsg = 
                    "ERROR: cannot locate JNDI DataSource [" +name+ "]. "
                   +"Likely problem: no DataSource or datasource is misconfigured.";
                errorMessage(errorMsg);
                throw new StartupException(errorMsg, ex, startupLog);
            }            
            successMessage("SUCCESS: located JNDI DataSource [" +name+ "]");
        }
        
        // So far so good. Now, can we get a connection?
        try { 
            Connection testcon = getConnection();
            testcon.close();
    //#DatabaseProvider.java:142: ?null dereference
    //#    testcon != null
    //#    severity: MEDIUM
    //#    class: org.apache.roller.weblogger.business.DatabaseProvider
    //#    method: void org.apache.roller.weblogger.business.DatabaseProvider()
    //#    basic block: bb_18
    //#    assertion: testcon != null
    //#    VN: getConnection(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
        } catch (Throwable t) {
            String errorMsg = 
                "ERROR: unable to obtain database connection. "
               +"Likely problem: bad connection parameters or database unavailable.";
            errorMessage(errorMsg);
            throw new StartupException(errorMsg, t, startupLog);
        }
    }
    //#DatabaseProvider.java:150: end of method: void org.apache.roller.weblogger.business.DatabaseProvider.org.apache.roller.weblogger.business.DatabaseProvider()
    
    
    private void successMessage(String msg) {
        startupLog.add(msg);
    //#DatabaseProvider.java:154: method: void org.apache.roller.weblogger.business.DatabaseProvider.successMessage(String)
    //#input(void successMessage(String)): log
    //#input(void successMessage(String)): msg
    //#input(void successMessage(String)): this
    //#input(void successMessage(String)): this.startupLog
    //#pre[1] (void successMessage(String)): log != null
    //#pre[4] (void successMessage(String)): this.startupLog != null
        log.info(msg);
    //#DatabaseProvider.java:155: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:info(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.DatabaseProvider
    //#    method: void successMessage(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:info(Object)
    }
    //#DatabaseProvider.java:156: end of method: void org.apache.roller.weblogger.business.DatabaseProvider.successMessage(String)
    
    private void errorMessage(String msg) {
        startupLog.add(msg);
    //#DatabaseProvider.java:159: method: void org.apache.roller.weblogger.business.DatabaseProvider.errorMessage(String)
    //#input(void errorMessage(String)): log
    //#input(void errorMessage(String)): msg
    //#input(void errorMessage(String)): this
    //#input(void errorMessage(String)): this.startupLog
    //#pre[1] (void errorMessage(String)): log != null
    //#pre[4] (void errorMessage(String)): this.startupLog != null
        log.error(msg);
    //#DatabaseProvider.java:160: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.DatabaseProvider
    //#    method: void errorMessage(String)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object)
    }
    //#DatabaseProvider.java:161: end of method: void org.apache.roller.weblogger.business.DatabaseProvider.errorMessage(String)
    

    /** 
     * List of success and error messages when class was first instantiated.
     **/
    public List<String> getStartupLog() {
        return startupLog;
    //#DatabaseProvider.java:168: method: List org.apache.roller.weblogger.business.DatabaseProvider.getStartupLog()
    //#input(List getStartupLog()): this
    //#input(List getStartupLog()): this.startupLog
    //#output(List getStartupLog()): return_value
    //#pre[2] (List getStartupLog()): init'ed(this.startupLog)
    //#post(List getStartupLog()): return_value == this.startupLog
    //#post(List getStartupLog()): init'ed(return_value)
    //#DatabaseProvider.java:168: end of method: List org.apache.roller.weblogger.business.DatabaseProvider.getStartupLog()
    }

    /**
     * Get database connection from data-source or driver manager, depending 
     * on which is configured.
     */
    public Connection getConnection() throws SQLException {
        if (getType() == ConfigurationType.JDBC_PROPERTIES) {
    //#DatabaseProvider.java:176: method: Connection org.apache.roller.weblogger.business.DatabaseProvider.getConnection()
    //#input(Connection getConnection()): __Descendant_Table[org/apache/roller/weblogger/business/DatabaseProvider]
    //#input(Connection getConnection()): __Descendant_Table[others]
    //#input(Connection getConnection()): __Dispatch_Table.getJdbcConnectionURL()Ljava/lang/String;
    //#input(Connection getConnection()): __Dispatch_Table.getType()Lorg/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType;
    //#input(Connection getConnection()): org/apache/roller/weblogger/business/DatabaseProvider$ConfigurationType.JDBC_PROPERTIES
    //#input(Connection getConnection()): this
    //#input(Connection getConnection()): this.__Tag
    //#input(Connection getConnection()): this.dataSource
    //#input(Connection getConnection()): this.jdbcConnectionURL
    //#input(Connection getConnection()): this.props
    //#input(Connection getConnection()): this.props._tainted
    //#input(Connection getConnection()): this.type
    //#output(Connection getConnection()): return_value
    //#pre[2] (Connection getConnection()): this.__Tag == org/apache/roller/weblogger/business/DatabaseProvider
    //#pre[7] (Connection getConnection()): init'ed(this.type)
    //#pre[3] (Connection getConnection()): (soft) this.dataSource != null
    //#pre[4] (Connection getConnection()): (soft) init'ed(this.jdbcConnectionURL)
    //#pre[5] (Connection getConnection()): (soft) this.props != null
    //#pre[6] (Connection getConnection()): (soft) this.props._tainted == 0
    //#post(Connection getConnection()): init'ed(return_value)
            return DriverManager.getConnection(getJdbcConnectionURL(), props);
        } else {
            return dataSource.getConnection();
    //#DatabaseProvider.java:179: end of method: Connection org.apache.roller.weblogger.business.DatabaseProvider.getConnection()
        }
    } 

    public ConfigurationType getType() {
        return type;
    //#DatabaseProvider.java:184: method: DatabaseProvider$ConfigurationType org.apache.roller.weblogger.business.DatabaseProvider.getType()
    //#input(DatabaseProvider$ConfigurationType getType()): this
    //#input(DatabaseProvider$ConfigurationType getType()): this.type
    //#output(DatabaseProvider$ConfigurationType getType()): return_value
    //#pre[2] (DatabaseProvider$ConfigurationType getType()): init'ed(this.type)
    //#post(DatabaseProvider$ConfigurationType getType()): return_value == this.type
    //#post(DatabaseProvider$ConfigurationType getType()): init'ed(return_value)
    //#DatabaseProvider.java:184: end of method: DatabaseProvider$ConfigurationType org.apache.roller.weblogger.business.DatabaseProvider.getType()
    }

    public String getJndiName() {
        return jndiName;
    //#DatabaseProvider.java:188: method: String org.apache.roller.weblogger.business.DatabaseProvider.getJndiName()
    //#input(String getJndiName()): this
    //#input(String getJndiName()): this.jndiName
    //#output(String getJndiName()): return_value
    //#pre[2] (String getJndiName()): init'ed(this.jndiName)
    //#post(String getJndiName()): return_value == this.jndiName
    //#post(String getJndiName()): init'ed(return_value)
    //#DatabaseProvider.java:188: end of method: String org.apache.roller.weblogger.business.DatabaseProvider.getJndiName()
    }

    public String getJdbcDriverClass() {
        return jdbcDriverClass;
    //#DatabaseProvider.java:192: method: String org.apache.roller.weblogger.business.DatabaseProvider.getJdbcDriverClass()
    //#input(String getJdbcDriverClass()): this
    //#input(String getJdbcDriverClass()): this.jdbcDriverClass
    //#output(String getJdbcDriverClass()): return_value
    //#pre[2] (String getJdbcDriverClass()): init'ed(this.jdbcDriverClass)
    //#post(String getJdbcDriverClass()): return_value == this.jdbcDriverClass
    //#post(String getJdbcDriverClass()): init'ed(return_value)
    //#DatabaseProvider.java:192: end of method: String org.apache.roller.weblogger.business.DatabaseProvider.getJdbcDriverClass()
    }

    public String getJdbcConnectionURL() {
        return jdbcConnectionURL;
    //#DatabaseProvider.java:196: method: String org.apache.roller.weblogger.business.DatabaseProvider.getJdbcConnectionURL()
    //#input(String getJdbcConnectionURL()): this
    //#input(String getJdbcConnectionURL()): this.jdbcConnectionURL
    //#output(String getJdbcConnectionURL()): return_value
    //#pre[2] (String getJdbcConnectionURL()): init'ed(this.jdbcConnectionURL)
    //#post(String getJdbcConnectionURL()): return_value == this.jdbcConnectionURL
    //#post(String getJdbcConnectionURL()): init'ed(return_value)
    //#DatabaseProvider.java:196: end of method: String org.apache.roller.weblogger.business.DatabaseProvider.getJdbcConnectionURL()
    }

    public String getJdbcPassword() {
        return jdbcPassword;
    //#DatabaseProvider.java:200: method: String org.apache.roller.weblogger.business.DatabaseProvider.getJdbcPassword()
    //#input(String getJdbcPassword()): this
    //#input(String getJdbcPassword()): this.jdbcPassword
    //#output(String getJdbcPassword()): return_value
    //#pre[2] (String getJdbcPassword()): init'ed(this.jdbcPassword)
    //#post(String getJdbcPassword()): return_value == this.jdbcPassword
    //#post(String getJdbcPassword()): init'ed(return_value)
    //#DatabaseProvider.java:200: end of method: String org.apache.roller.weblogger.business.DatabaseProvider.getJdbcPassword()
    }

    public String getJdbcUsername() {
        return jdbcUsername;
    //#DatabaseProvider.java:204: method: String org.apache.roller.weblogger.business.DatabaseProvider.getJdbcUsername()
    //#input(String getJdbcUsername()): this
    //#input(String getJdbcUsername()): this.jdbcUsername
    //#output(String getJdbcUsername()): return_value
    //#pre[2] (String getJdbcUsername()): init'ed(this.jdbcUsername)
    //#post(String getJdbcUsername()): return_value == this.jdbcUsername
    //#post(String getJdbcUsername()): init'ed(return_value)
    //#DatabaseProvider.java:204: end of method: String org.apache.roller.weblogger.business.DatabaseProvider.getJdbcUsername()
    }

}
    //#DatabaseProvider.java:: end of class: org.apache.roller.weblogger.business.DatabaseProvider$ConfigurationType
    //#DatabaseProvider.java:: end of class: org.apache.roller.weblogger.business.DatabaseProvider
