blob: 7d33a79e00f59ec83759a5486872d582fae093b1 [file] [log] [blame]
/*
* 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();
}
}
}