/*
 * Copyright (c) 2004, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.devtest.security.plogin.converter.client;

import java.util.Properties;
import java.math.BigDecimal;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import jakarta.transaction.UserTransaction;
import com.sun.appserv.security.*;
import com.sun.devtest.security.plogin.converter.ejb.*;

import com.sun.ejte.ccl.reporter.SimpleReporterAdapter;

/**
 * A simple java client. This uses the services provided by the <code>ConverterBean</code> and
 * converts 100 US dollars to Yen and 100 Yen to Euro.
 * <p>In this regard, it does the following in order
 * <ul>
 * <li>Locates the home interface of the enterprise bean
 * <li>Gets a reference to the remote interface
 * <li>Invokes business methods
 * </ul>
 * <br>
 * <b>Locating the home interface:</b>
 * <blockquote><pre>
 *        Context initial = new InitialContext();
 *        Context myEnv = (Context)initial.lookup("java:comp/env");
 *        Object objref = myEnv.lookup("ejb/SimpleConverter");
 *  ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objref, ConverterHome.class);
 * </pre></blockquote>
 * <br>
 * <b>Creating the remote interface:</b>
 * <blockquote><pre>
 *        Converter currencyConverter = home.create();
 * </pre></blockquote>
 * <br>
 * <b>Invoking business methods:</b>
 * <blockquote><pre>
 *  BigDecimal param = new BigDecimal ("100.00");
 *        amount = currencyConverter.dollarToYen(param);
 *  amount = currencyConverter.yenToEuro(param);
 * </pre></blockquote>
 * <br>
 * <b>Output:</b>
 * <pre>
 * 12160.00
 * 0.77
 * </pre>
 *
 *
 */

public class ConverterClient {

    private static SimpleReporterAdapter stat =
            new SimpleReporterAdapter("appserv-tests");

    ConverterClient() {
    }

   /**
    * The main method of the client. This invokes the <code>ConverterBean</code> to use
    * its services. It then asks the bean to convert 100 dollars to yen and
    * 100 yen to euro. The results are printed at the terminal where the client is run.
    * See <code>appclient</code> documentation in SunONE app server to run the clinet.
    *
    */
    public static void main(String[] args) {
        ConverterClient client = new ConverterClient();
        client.run(args);
    }

    private void run(String[] args) {
        String url = null;
        String testIdPrefix = null;
        String testId = "";
        String jndiName = null;
        Context context = null;
        String ctxFactory = null;
        java.lang.Object obj = null;
        try {
            stat.addDescription("Security::client side programmatic login");

            if (args.length == 3) {
                url = args[0];
                ctxFactory = args[1];
                jndiName = args[2];
            }

            String user = "shingwai";
            String password = "shingwai";

            ProgrammaticLogin plogin = new ProgrammaticLogin();
            plogin.login(user, password);
            boolean isAppClientTest = (url == null) || (ctxFactory == null);

            /*
             * User tx is to test issue:
             * https://glassfish.dev.java.net/issues/show_bug.cgi?id=1568
             */
            UserTransaction ut = null;

            if (isAppClientTest) {
                testIdPrefix = "Sec::PLogin Converter Sample AppClient";
                testId = testIdPrefix;
                // Initialize the Context with default properties
                context = new InitialContext();
                System.out.println("PLogin Test \nDefault Context Initialized...");
                // Create Home object
                obj = context.lookup("java:comp/env/ejb/PLoginSimpleConverter");
                ut = (UserTransaction) context.lookup("UserTransaction");
            } else {
                testIdPrefix = "Sec::PLogin Standalone-Client";
                testId = testIdPrefix;
                Properties env = new Properties();
                env.put("java.naming.provider.url", url);
                env.put("java.naming.factory.initial", ctxFactory);
                // Initialize the Context with JNDI specific properties
                context = new InitialContext(env);
                System.out.println("Context Initialized with " +
                                   "URL: " + url + ", Factory: " + ctxFactory);
                // Create Home object
                obj = context.lookup(jndiName);

                ut = (UserTransaction) context.lookup("UserTransaction");
            }
            ConverterRemoteHome home =
               (ConverterRemoteHome) PortableRemoteObject.narrow(obj,
                                            ConverterRemoteHome.class);

            ConverterRemote currencyConverter = home.create();

            System.out.println("\n\n\n===========Beginning Simple Test=====\n\n");
            testId = testIdPrefix + " Programmatic Login";
            processRequest(home, "100");
            processRequest(home, "200");
            processRequest(home, "300", ut);
            stat.addStatus(testId, stat.PASS);
            try {
                System.out.println("Logout ...");
                testId = testIdPrefix + " Programmatic Logout";
                plogin.logout();
                if (!isAppClientTest) {
                    //in case of appclient, this will prompt for password in GUI
                    processRequest(home, "400");
                    stat.addStatus(testId, stat.FAIL);
                    System.out.println("Unauthorized Access to Converter!");
                }
            } catch(java.rmi.AccessException ae) {
                stat.addStatus(testId, stat.PASS);
                System.out.println("OK! Got an expected java.rmi.AccessException");
            }

            testId = testIdPrefix + " Programmatic Relogin after logout";
            plogin.login(user, password);
            processRequest(home, "500");
            processRequest(home, "600");
            stat.addStatus(testId, stat.PASS);

            try {
                System.out.println("Incorrect Login ...");
                testId = testIdPrefix + " Programmatic Incorrect login";
                plogin.login(user, password + "123");
                processRequest(home, "700");
                stat.addStatus(testId, stat.FAIL);
                System.out.println("Unauthorized Access to Converter!");
            } catch(java.rmi.AccessException ae) {
                stat.addStatus(testId, stat.PASS);
                System.out.println("OK! Got an expected java.rmi.AccessException");
            }

            testId = testIdPrefix + " Programmatic Relogin after fail login";
            plogin.login(user, password);
            processRequest(home, "800");
            stat.addStatus(testId, stat.PASS);
        } catch (Throwable ex) {
            System.err.println("TestID" +testId);
            stat.addStatus(testId, stat.FAIL);
            System.err.println("Caught an unexpected exception!");
            ex.printStackTrace();
        } finally {
            stat.printSummary();
        }
    }

    // default method that does not require transaction
    private void processRequest(ConverterRemoteHome home, String amt)
        throws Exception {

        processRequest(home, amt, null);
    }

    private void processRequest(ConverterRemoteHome home, String amt,
        UserTransaction tx) throws Exception {

        ConverterRemote currencyConverter = home.create();

        String s = currencyConverter.myCallerPrincipal();
        System.out.println(" The caller principal received from ejb ->"+s);

        BigDecimal param = new BigDecimal (amt);
        if (tx != null) {
            System.out.println("Beginning user transaction");
            tx.begin();
        }

        BigDecimal amount = currencyConverter.dollarToYen(param);
        System.out.println("$" + amt + " is : "+amount+"Yen");
        amount = currencyConverter.yenToEuro(param);
        System.out.println("Yen is :"+amount+"Euro\n");

        if (tx != null) {
            System.out.println("Committing user transaction");
            tx.commit();
        }
    }

}
