package com.sap.mw.jco.jra.examples;

import java.io.*;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.*;

public class TestClient
{

    public TestClient()
    {
    }

    /**
     * This helper method generates a 8 digit number
     */
    private static String generateBankNumber()
    {
        String bankNumber = "";
        for(int i = 0; i < 8; i++)
        {
            long digit = Math.round(Math.random() * (double)10);
            if(digit > 9)
                digit = 9;
            bankNumber = bankNumber + digit;
        }

        return bankNumber;
    }

    public static void main(String args[])
    {

        // you need to configure the logon properties for your App. Server
        String m_bankNumber = "";
        String url = "localhost";
        String userName = "Administrator";
        String password = "";
        Context ctx = null;

        try
        {
            // This is an example of properties you need to set.
            // Following properties are real properties needed for SAP J2EE Engine 6.20
            Properties ctxProp = new Properties();
            ctxProp.put("java.naming.factory.initial", "com.inqmy.services.jndi.InitialContextFactoryImpl");
            //contextFactoryName = "com.sap.engine.services.jndi.InitialContextFactoryImpl"; // for SAP J2EE Engine 6.30
            ctxProp.put("java.naming.provider.url", url);
            ctxProp.put("java.naming.security.principal", userName);
            ctxProp.put("java.naming.security.credentials", password);
            ctx = new InitialContext(ctxProp);
        }
        catch(NamingException e)
        {
            System.out.println("Can't get context.");
            System.exit(1);
        }

        // lookup for EJB instances
        ExampleHome home = null;
        try
        {
            home = (ExampleHome)ctx.lookup("ExampleBean");
        }
        catch(Exception e)
        {
            System.out.println("Can't look up ExampleBean.");
            e.printStackTrace();
        }
        Example bean = null;
        try
        {
            bean = home.create();
        }
        catch(Exception e)
        {
            System.out.println("Can't create an ExampleBean .");
            e.printStackTrace();
        }
        ExampleBMHome bmhome = null;
        try
        {
            bmhome = (ExampleBMHome)ctx.lookup("ExampleBMBean");
        }
        catch(Exception e)
        {
            System.out.println("Can't look up ExampleBMBean.");
            e.printStackTrace();
        }
        ExampleBM bmbean = null;
        try
        {
            bmbean = bmhome.create();
        }
        catch(Exception e1)
        {
            System.out.println("Can't create an ExampleBMBean .");
            e1.printStackTrace();
        }

        ExampleAMAHome amahome = null;
        try
        {
            amahome = (ExampleAMAHome)ctx.lookup("ExampleAMABean");
        }
        catch(Exception e)
        {
            System.out.println("Can't look up ExampleAMABean.");
            e.printStackTrace();
        }
        ExampleAMA amabean = null;
        try
        {
            amabean = amahome.create();
        }
        catch(Exception e1)
        {
            System.out.println("Can't create an ExampleAMABean .");
            e1.printStackTrace();
        }

        // load R/3 connection properties. There are only needed for ExampleAMABean
        Properties prop = null;
        if (args == null || args.length == 0 || args[0].equals("")) {
            System.out.println("Usage java com.sap.mw.jco.jra.examples.TestClient <logon-properties>");
            //System.exit(1);
        }//if
        else
        {
            try {
                prop = new Properties();
                prop.load(new FileInputStream(args[0]));
            }
            catch(Exception e)
            {
                System.out.println("properties could not be loaded");
                //System.exit(1);
            }
        }

        System.out.println("output from examples");
        try
        {
            //call methods from beans
            System.out.println("\nCalling method testSimpleConnection() ");
            System.out.println(bean.testSimpleConnection());

            System.out.println("\nCalling method callFunctionStfcConnection() ");
            System.out.println(bean.callFunctionStfcConnection("Function STFC_CONNECTION successfully called"));

            System.out.println("\nCalling method callBapiBankCreateUsingContainerTransaction()");
            m_bankNumber = generateBankNumber();
            System.out.println(bean.callBapiBankCreateUsingContainerTransaction("DE", m_bankNumber, "ContainerTransaction", "Walldorf"));
            System.out.println("Calling method callBapiBankGetDetail() ");
            System.out.println(bean.callBapiBankGetDetail("DE", m_bankNumber));

            System.out.println("\nCalling method callBapiBankCreateUsingUserTransaction");
            m_bankNumber = generateBankNumber();
            System.out.println(bmbean.callBapiBankCreateUsingUserTransaction("DE", m_bankNumber, "UserTransaction", "Walldorf"));
            System.out.println("Calling method callBapiBankGetDetail() ");
            System.out.println(bean.callBapiBankGetDetail("DE", m_bankNumber));

            System.out.println("\nCalling method callBapiBankCreateUsingLocalTransaction");
            m_bankNumber = generateBankNumber();
            System.out.println(bmbean.callBapiBankCreateUsingLocalTransaction("DE", m_bankNumber, "UserTransaction", "Walldorf"));
            System.out.println("Calling method callBapiBankGetDetail() ");
            System.out.println(bean.callBapiBankGetDetail("DE", m_bankNumber));

            System.out.println("\nCalling method testSimpleConnection() on ExampleAMABean");
            System.out.println(amabean.testSimpleConnection(prop));

            System.out.println("\nCalling method callBapiBankGetList() from component (bean) Managed bean ");
            System.out.println("List of banks:");
            System.out.println((Util.transformTableToString("\t", bean.callBapiBankGetList("DE", 5))));
        }
        catch(Throwable e)
        {
            System.err.println("\nException on Client invocating bean methods");
            e.printStackTrace();
        }
    }
}