/*

   Derby - Class nserverdemo.NsSample

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   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.

 */
 
package nserverdemo;


import java.util.Properties;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.io.PrintWriter;


/**

 The Network Server sample demo program is a
 simple JDBC application that interacts with the Derby Network Server.
 The program:

 1.	starts the Derby Network Server
 2. creates the database if not already created
 3. checks to see if the schema is already created, and if not,
 4. creates the schema which includes the table SAMPLETBL and corresponding indexes.
 5. connects to the database
 6. loads the schema by inserting data
 7. starts client threads to perform database related operations
 8. has each of the clients perform DML operations (select, insert, delete, update) using JDBC calls,
    i)	 one client opens an embedded connection to perform database operations
         You can open an embedded connection in the same JVM that starts the Derby Network
         Server.
    ii)  one client opens a client connection to the Derby Network Server to perform database operations.
 9. waits for the client threads to finish the tasks
 10.shuts down the Derby Network Server at the end of the demo

 <P>
 Usage: java nserverdemo.NsSample
 <P>
 Please note, a file derby.log is created in the directory you run this program.
 This file contains the logging of connections made with the derby network server
 */

public class NsSample {

	public static final String DERBY_CLIENT_DRIVER = "org.apache.derby.jdbc.ClientDriver";
	public static int NUM_ROWS = 50; /* Number of rows to load initially */
	public static int ITERATIONS = 10;  //Each client does these many iterations
	public static int NUM_CLIENT_THREADS = 2;


	// network server control specific
	private static int NETWORKSERVER_PORT=1621;

	// Derby database connection URL for embedded environment
	public static final String CS_EMBED_DBURL="jdbc:derby:NSSampledb;";

	// To connect to Derby Network Server
	// This URL describes the target database for type 4 connectivity
	// Notice that the properties may be established via the URL syntax
        // URL for the Derby client JDBC driver.
	private static final String DERBY_CLIENT_URL= "jdbc:derby://localhost:"+NETWORKSERVER_PORT+"/NSSampledb;create=true;";

        // Default to using the Derby Client JDBC Driver for database connections
        String url = DERBY_CLIENT_URL;
        String jdbcDriver = DERBY_CLIENT_DRIVER;

	public static void main(String[] args) throws Exception {

                   new nserverdemo.NsSample().startSample(args);
        }
	public void startSample(String[] args) throws Exception {
	  NetworkServerUtil nwServer;

	  Connection conn = null;

	  PrintWriter pw = null;
          
      

	  try  {

		pw = new PrintWriter(System.out,true);	// to print messages
		pw.println("Using JDBC driver: " + jdbcDriver);

		/* Start - In order to start the network server do the following
		   In case you want to start the server as a script or another program
		   comment out the next block of code (i.e. until the comment line 'End - network server started')
		   Also, comment out the 'Shutdown Derby Network Server' line of code at the bottom
		   In case you decide to comment out the starting of the network server, make sure that the
		   client thread is not making an embedded connection but instead making only a client connection.
		   Also note, the server logs messages to the file derby.log in the
		   directory you run this program
		 */

		 	{
				nwServer = new NetworkServerUtil(NETWORKSERVER_PORT,pw);
				nwServer.start();

				boolean knowIfServerUp = false; //do we know if server is ready to accept connections
				int numTimes = 5;

				// Test to see if server is ready for connections, for 15 seconds.
				while(!knowIfServerUp && (numTimes >0)) {
					try {
						// testing for connection to see if the network server is up and running
						// if server is not ready yet, this method will throw an exception
						numTimes--;
						nwServer.testForConnection();
						knowIfServerUp = true;
					}
					catch(Exception e) {
						System.out.println("[NsSample] Unable to obtain a connection to network server, trying again after 3000 ms.");
						Thread.currentThread().sleep(3000);
					}
				}
				if(!knowIfServerUp) {
					pw.println("[NsSample] Exiting, since unable to connect to Derby Network Server.");
					pw.println("[NsSample] Please try to increase the amount of time to keep trying to connect to the Server.");
					System.exit(1);
				}

				pw.println("[NsSample] Derby Network Server started.");
			}
		/*End - network server started*/

		pw.println("[NsSample] Sample Derby Network Server program demo starting. ");
		pw.println("Please wait .....................");

		// See Derby documentation for description of properties that may be set
		//  in the context of the network server.
		Properties properties = new java.util.Properties();

		// The user and password properties are a must, required by JCC
		properties.setProperty("user","derbyuser");
		properties.setProperty("password","pass");

		// Get database connection via DriverManager api
		try	{
			
			conn =  (Connection) DriverManager.getConnection(url, properties);
		} catch(Exception e) {
			pw.println("[NsSample] Connection request unsuccessful, exception thrown was: ");
			pw.println("[NsSample] Please check if all the jar files are in the classpath and the dbUrl is set correctly.");
			e.printStackTrace();
			System.exit(1);  //critical error, so exit
		  }

		NsSampleWork.checkAndCreateSchema(conn,pw); // Check and create the necessary schema if not already created
		NsSampleWork.loadSchema(conn,NUM_ROWS,pw); // Insert rows into the table
		conn.close();

		// Start client threads to perform database related sql operations
		NsSampleClientThread clientThreads[] = new NsSampleClientThread[NUM_CLIENT_THREADS];


		/* Only the JVM that starts the Derby Network Server can obtain an embedded connection
		   Please pay attention to the database URL
		   Also, you need not load the org.apache.derby.jdbc.EmbeddedDriver since it is already loaded when
		   the network server starts up.
		   1. Derby embedded database url - jdbc:derby:databasename
		*/
		clientThreads[0] = new NsSampleClientThread(1,CS_EMBED_DBURL,properties,pw);
		clientThreads[0].start();


		/*
		   2. The below client threads obtain a client connection to Derby Network Server
		   One can also get a client connection from another JVM
		   Please be aware of the database URL for obtaining a client connection
		 */
		for (int i=1; i<NUM_CLIENT_THREADS; i++) {
			clientThreads[i] = new NsSampleClientThread(i+1,url,properties,pw);
			clientThreads[i].start();

		}

		// Wait for the client threads to complete all the work
		for (int i = 0; i < NUM_CLIENT_THREADS; i++)
		   clientThreads[i].join();

		 // Shutdown Derby network server
		 pw.println("[NsSample] Shutting down network server.");
		 nwServer.shutdown();
		 pw.println("[NsSample] End of Network server demo.");

   	  } catch (Exception e) {
		  e.printStackTrace();
		}
   	  finally
   	  {
		if(pw != null) pw.close();
      }
	 }


}
