//  
//  Source File Name: UseThrds.java  1.8 
//  
//   Licensed Materials -- Property of IBM 
//  
//   (c) Copyright International Business Machines Corporation, 1999,2000. 
//       All Rights Reserved. 
//  
//   US Government Users Restricted Rights - 
//   Use, duplication or disclosure restricted by 
//   GSA ADP Schedule Contract with IBM Corp. 
//  
//     PURPOSE : 
//     - demonstrates the use of threads to run asynchronous functions 
//     - shows how to use a class to exchange information between thread 
//       and main program 
//     Notes: 
//     (1): The "connect to database" method uses default user ID and  
//          password to connect to the sample database 
//     (2): This sample will not work on platforms for which DB2 does 
//          not support multi-threaded applications. 

//  For more information about this sample, refer to the README file. 

//  For more information on Programming in Java, refer to the  
//  "Programming in Java" section of the Application Development Guide. 

//  For more information on building and running Java programs for DB2, 
//  refer to the "Building Java Applets and Applications" section of the  
//  Application Building Guide. 

//  For more information on the SQL language, refer to the SQL Reference. 

import java.io.*;
import java.lang.*;
import java.sql.*;

class UseThrds {

   static {
      try {
         //  register the driver with DriverManager 
         //  The newInstance() call is needed for the sample to work with 
         //  JDK 1.1.1 on OS/2, where the Class.forName() method does not 
         //  run the static initializer. For other JDKs, the newInstance 
         //  call can be omitted. 
         Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public static void main (String[] argv) {
      try {
         int numInt = 0;

         //  Set the department number 
         if (argv.length == 0) 
         {   numInt = 10;  
         }
         else if (argv.length == 1)
         {   String  num  = argv[0];
             Integer temp = Integer.valueOf (num);	   
             numInt       = temp.intValue();
         }
         else 
         {   throw new Exception("\nUsage: java UseThrds [departmentNumber]\n");
         } 

         Department deprtmnt = new Department (numInt);

         //  create and start the thread 
         SQLExecution sqlexec = new SQLExecution (deprtmnt);
         sqlexec.start();

         //  indicate that thread is running along with the program 
         System.out.print ("\nRunning thread...");
         while (sqlexec.isAlive()) {
            System.out.print (".");
            for (int delay = 1; delay <= 500000; delay = delay + 1) {}
         }

         //  print all information received from thread and stored in Department class 
         deprtmnt.printDeptInfo();
      } catch (Exception e) {e.printStackTrace(); }
   }
}

//  
//  SQLExecution 
//     - thread (runs independently from main program) 
//     - queries the org table for information about the deptnum chosen 
//  

class SQLExecution extends Thread {
   private Department department;

   public SQLExecution (Department dept) {
      department = dept;
   }

   public void run() {
      Connection con = null;
      try {
         //  connect to the database sample using the default userid, password 
         con = DriverManager.getConnection("jdbc:db2:sample");
         con.setAutoCommit(false);
         String deptName = new String("");
         String division = new String("");
         String location = new String("");

         Statement stmt = con.createStatement();
         ResultSet rs = stmt.executeQuery ("SELECT deptname, division, location " +
            "from org WHERE deptnumb = " + department.getDeptNum());
         if (rs.next()) {
            deptName = rs.getString (1);
            division = rs.getString (2);
            location = rs.getString (3);
            //  pass in results of query to object Department 
            department.setDeptInfo (deptName, division, location);
         } else { department.setDeptInfo ("NO SUCH DEPT NUMBER", "", ""); }

         //  disconnect from the server and commit changes 
         rs.close();
         con.commit();
         con.close();
      } catch (Exception e) { e.printStackTrace(); }
   }
}

//  
//  Department 
//     - this class allows interaction and passing of information 
//       between the main program and the thread so that information 
//       gathered in the thread can be accessed (printed) from the 
//       main program 
//  

class Department {
   private int deptNum;
   private String deptName;
   private String division;
   private String location;

   public Department (int num) {
      deptNum = num;
   }

   public int getDeptNum() {
      return deptNum;
   }

   public void setDeptInfo (String name, String dvison, String loc) {
      deptName = new String (name);
      division = new String (dvison);
      location = new String (loc);
   }

   public void printDeptInfo() {
      System.out.print ("\n\nDEPARTMENT #    : ");
      String deptNumString = String.valueOf (deptNum);
      System.out.println (deptNumString );

      System.out.print ("DEPARTMENT NAME : ");
      System.out.println (deptName );

      System.out.print ("DIVISION        : ");
      System.out.println (division );

      System.out.print ("LOCATION        : ");
      System.out.println (location );

   }
}