/*
 *  ConnectionTest.java
 *  -------------------	 
 *  CoersionTest.java
 *
 *  Demonstrates the use of subprotocal in creating and connecting to
 *   dtF/SQL databases.
 *
 *
 *	 6-Jul-1999 Will Gilbert, Gilbert@Informagen.com
 *
 *----------------------------------------------------------------------------------------
 *
 *    DriverManager.getConnection(String jdbcURL);
 *    DriverManager.getConnection(String jdbcURL, Properties properties);
 *    DriverManager.getConnection(String jdbcURL, String username, String password);
 *
 *
 *  URL
 *  ---
 *    Format: "jdbc:dtF:<database path>;<attr=value>;...;<attr=value>"
 *
 *    <database path/file> as determined by File.getCanonicalPath()
 *
 *       or
 *
 *    relative paths will use System.getProperty("user.dir") as the anchor.
 *
 *
 *  Attribute/Value pairs
 *  ---------------------
 *    Format: "jdbc:dtF:<database path>;attr=value;...;attr=value
 *
 *    Attributes:  
 *      UID | USR | user - login username
 *      PWD | password   - login password
 *
 *      Create - What to do if it can't find the database file:
 *                 "always" - always create a new database, deleting any old ones.
 *                 "never" - Don't create a new database even if one doesn't exist.
 *                 "maybe" - create a new database only if one doesn't exist (the default).
 *      APPL   - Macintosh application creator type to assign to the database & BLOB file, 
 *                 defaults to "dtFA", the dtFAdmin application,
 *      DType  - Macintosh file type of database file, defaults to "DTFD" used by dtFAdmin.
 *      BType  - Macintosh file type of BLOB file, defaults to "DTFB" used by dtFAdmin.
 *      BAPPL  - Application creator for BLOB file.  If left unspecified and BTYPE has
 *               been specified the value of APPL will be used for BAPPL. In other words
 *               "APPL=MyAp;DTYPE=data;BTYPE=blob" is equivalent to but simplier than 
 *               "APPL=MyAp;DTYPE=data;BAPPL=MyAp;BTYPE=blob"
 *               
 *
 *
 *  Properties
 *  ----------
 *  By using a prefix of "dtF." in the properties file a single property file
 *    could be used with a multitude of JDBC connections.  The "dtF." properties
 *    would be ignored by other JDBC implementations.  The exceptions are "user" and
 *    "password" which are used by JDBC, as well as UID and PWD which are used by
 *    ODBC.
 *
 *
 *    Keys:  
 *      UID | user     | dtF.Username    - logon username
 *      PWD | password | dtF.Password    - logon password
 *
 *      dtF.dbpath   - <database path/file>
 *      dtF.Create - What to do if you can't find the database
 *               "always" - always create a new database, deleting the old one
 *               "never" - Don't create a new database if one exists
 *               "maybe" - create a new one only if one doesn't exist (the default)
 *      dtF.APPL   - Macintosh creator type to assign to the database & BLOB file, 
 *                     defaults to "swBT", the dtFAdmin application
 *      dtF.DType  - Macintosh file type of database file, defaults to "DTFD"
 *      dtF.BType  - Macintosh file type of BLOB file, defaults to "DTFB"
 */



import java.io.File;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import java.util.Properties;


public class ConnectionTest {
	
	public static void main(String args[]) {
	
	
		//  - Can we find the Driver library and the native shared library
	
		try {
			Class.forName("com.informagen.jdbc.dtF.Driver");
		} catch(ClassNotFoundException e) {
			System.out.println(e.toString());
		}

		final String username = "dtfadm";
		final String password = "dtfadm";
		
		String jdbcURL = null;

		
		Properties theProperties = new Properties();
					
		theProperties.put("dtF.Username", username);
		theProperties.put("dtF.Password", password);
		
		File defaultDir = new File (System.getProperty("user.dir"));
		
		File dbFile = new File(defaultDir, "Sample Database");

		Connection theConnection = null;


		try {

			// Using a properties object with the full path specifed
			

			theProperties.put("dtF.dbpath", dbFile.getAbsolutePath());

			System.out.println("\nOpening a connection using full paths.");
			System.out.println("Database: " + theProperties.getProperty("dtF.dbpath"));
			theProperties.put("dtF.Create", "always");


			theConnection = DriverManager.getConnection("jdbc:dtF", theProperties);

			theProperties.remove("dtF.Create");

			if (theConnection == null)
				System.out.println("Driver failed - null Connection returned.");	
			else
				System.out.println("-- Success");	

			theConnection.close();

			System.out.println("\nAttempting a second connection to newly created database.");

			theConnection = DriverManager.getConnection("jdbc:dtF", theProperties);

			if (theConnection == null)
				System.out.println("Driver failed - null Connection returned.");	
			else
				System.out.println("-- Success");	

			theConnection.close();

		} catch(SQLException sqle) {
			System.out.println(sqle.toString());
		}


		try {

			// Using a properties object with the relative path (/sub) specified

			File subDir = new File(defaultDir, File.separator + "sub");
			
			if ( subDir.exists() == false )
				subDir.mkdir();
				
							
			theProperties.put("dtF.dbpath", "sub" + File.separator + dbFile.getName());

			System.out.println("\nOpening a connection using relative path.");
			System.out.println("Database: " + theProperties.getProperty("dtF.dbpath"));


			theConnection = DriverManager.getConnection("jdbc:dtF", theProperties);
			
			if (theConnection == null)
				System.out.println("Driver failed - null Connection returned.");	
			else
				System.out.println("-- Success");	

			theConnection.close();


		} catch(SQLException sqle) {
			System.out.println(sqle.toString());
		}


		try {

			// Using a properties object with the database name only
		
			
			theProperties.put("dtF.dbpath", dbFile.getName());
			
			System.out.println("\nOpening a connection using filename only in properties.");
			System.out.println("Database: " + theProperties.getProperty("dtF.dbpath"));

			theConnection = DriverManager.getConnection("jdbc:dtF", theProperties);
			
			if (theConnection == null)
				System.out.println("Driver failed - null Connection returned.");	
			else
				System.out.println("-- Success");	

			theConnection.close();


		} catch(SQLException sqle) {
			System.out.println(sqle.toString());
		}



		// Using a URL with username and password

		try {

			jdbcURL = "jdbc:dtF:" + dbFile.getName();
			
			System.out.println("\nOpening a connection using getConnection(\"" + jdbcURL + "\"," + username + 
			                    ", " + password +");");
			
			
			theConnection = DriverManager.getConnection(jdbcURL, username, password);
			
			if (theConnection == null)
				System.out.println("Driver failed - null Connection returned.");	
			else
				System.out.println("-- Success");	

			theConnection.close();

		} catch(SQLException sqle) {
			System.out.println(sqle.toString());
		}



		// Using a URL with username and password specified in the subprotocal

		try {
						
			jdbcURL = "jdbc:dtF:" +  dbFile.getName() + ";UID=dtfadm;PWD=dtfadm";

			System.out.println("\nOpening a connection using getConnection(\"" + jdbcURL + "\");");
			
			theConnection = DriverManager.getConnection(jdbcURL);
			
			if (theConnection == null)
				System.out.println("Driver failed - null Connection returned.\n");	
			else
				System.out.println("-- Success");	

			theConnection.close();

		} catch(SQLException sqle) {
			System.out.println(sqle.toString());
		}


		// Create a database with a custom icon.
		
		try {
	
			jdbcURL = "jdbc:dtF:E. coli;USR=dtfadm;PWD=dtfadm;Create=always;APPL=GIVE;DType=FILE";

			System.out.println("\nOpening a connection using getConnection(\"" + jdbcURL + "\");");
			
			theConnection = DriverManager.getConnection(jdbcURL);
			
			if (theConnection == null)
				System.out.println("Driver failed - null Connection returned.");	
			else
				System.out.println("-- Success");	

			theConnection.close();

		} catch(SQLException sqle) {
			System.out.println(sqle.toString());
		}


		// Opening a connection with a bad username/password.
		
		try {
	
			jdbcURL = "jdbc:dtF:" +  dbFile.getName();

			System.out.println("\nOpening a connection with a bad username/password. " + jdbcURL);
			
			theConnection = DriverManager.getConnection(jdbcURL, "foo", "bar");
			
			if (theConnection == null)
				System.out.println("Driver failed - null Connection returned.");	
			else
				System.out.println("-- Success");	

			theConnection.close();

		} catch(SQLException sqle) {
			System.out.println(sqle.toString());
		}


		System.out.println("\nConnection Test Done.");
			 
	}

}