This sample application uses a separate class to handle Login/Logout process and performs actual work in the main class. This is an example of a TN5250 application running in an unmanaged environment. Similar samples are located in the directory ...\samples\tn5250\.
/**
* Sample client Logon/Logoff class. It should use provided
* Connection to perform logon and logoff to the EIS system.
*/
// Import necessary packages and classes needed
import javax.resource.*;
import javax.resource.cci.*;
import javax.resource.spi.*;
import javax.resource.spi.security.*;
import java.util.*;
import com.ibm.connector2.cci.*;
import com.ibm.connector2.hod.*;
import com.ibm.eNetwork.ECL.ECLScreenDesc;
public class J2HODScreenVMLogonLogoff implements com.ibm.connector2.cci.LogonLogoff
{
private static final String TRACE_HEADER = "J2HODScreenVMLogonLogoff";
static final String TRACE_ENTRY = "-) [";
static final String TRACE_EXIT = "(- [";
static final String TRACE_ERROR = " ***ERROR*** ";
static final String TRACE_STATUS = " + ";
static final String TRACE_INPUT_ONLY = " *** Expect to see Input screen only ***";
static final String TRACE_INPUT_OUTPUT = " *** Expect to see both Input and Output screens ***";
static final String TRACE_OUTPUT_ONLY = " *** Expect to see Output screen only ***";
public J2HODScreenVMLogonLogoff()
{
super();
}
// Handles Logging-in process
public void logon(Connection connection, javax.security.auth.Subject subject) throws javax.resource.ResourceException
{
System.out.println(TRACE_ENTRY + TRACE_HEADER + ".logon()]");
J2HODConnection j2hodconn = null;
try {
j2hodconn = (J2HODConnection)connection;
}
catch (java.lang.Throwable exception) {
throw new javax.resource.ResourceException("Invoked using invalid Connection specified.");
}
String userName = null;
String password = null;
Iterator it = subject.getPublicCredentials().iterator();
PasswordCredential pc = null;
while(it.hasNext())
{ // gets Password credential information
Object o = it.next();
try{
pc = (PasswordCredential)o;
}
catch(ClassCastException exn1){}
}
if (pc != null)
{ // gets User Name and Password
userName = pc.getUserName();
password = new String(pc.getPassword());
}
// Create records for Input and Output
// Input is null in this case since we'll be receiving information only at this time
// thus having no input
J2HODScreenRecord input = null;
J2HODScreenRecord output = new J2HODScreenRecord(24, 80);
// receive current screen and check for the login screen
try {
// Create an InteractionSpec and set properties of what to recognize in the
// resulting output screen from the execution
J2HODInteractionSpec interactionSpec = new J2HODInteractionSpec();
interactionSpec.setInteractionVerb(new Integer(J2HODInteractionSpec.SYNC_RECEIVE));
interactionSpec.setRecognizeRow(new Integer(1));
interactionSpec.setRecognizeColumn(new Integer(36));
interactionSpec.setRecognizeString("Sign On");
interactionSpec.setScreenName("Logon screen");
// Execute interaction
System.out.println (TRACE_OUTPUT_ONLY);
j2hodconn.execute(interactionSpec, input, output);
// checks for output result
output.checkBytes("Sign On", 1, 36, false, true);
}
catch (java.lang.Throwable exception) {
throw new javax.resource.ResourceException("Logon exception");
}
// now we are currently at the login screen
try {
// enter username, password
input = (J2HODScreenRecord)output.clone();
input.setString(userName, 6, 53);
input.setString(password, 7, 53);
// For more complex description of output screen, a vector of ECLScreenDesc instances
// can be used to describe the possible next output screen.
// ( ** Refer to Host Access Client Library (HACL) document for more information on
// ECLScreenDesc class and other HACL classes. )
// In this case after entering ID and password, "Main Menu" or "Messages" screen is expected.
Vector v = new Vector();
ECLScreenDesc screenDesc1 = new ECLScreenDesc();
screenDesc1.AddOIAInhibitStatus(ECLScreenDesc.NOTINHIBITED);
screenDesc1.AddStringInRect("AS/400 Main Menu", 1, 33, 1, 48, false);
screenDesc1.SetName("Main Menu");
v.add(screenDesc1);
ECLScreenDesc screenDesc2 = new ECLScreenDesc();
screenDesc2.AddOIAInhibitStatus(ECLScreenDesc.NOTINHIBITED);
screenDesc2.AddStringInRect("Press Enter to continue.", 19, 2, 19, 25, false);
screenDesc2.SetName("Message");
v.add(screenDesc2);
// Sets interaction specs with screen descriptor vector and key
J2HODInteractionSpec interactionSpec = new J2HODInteractionSpec();
interactionSpec.setScreenDescriptors(v);
interactionSpec.setKeyName(J2HODInteractionSpec.ENTER);
// Execute interaction and output should be either a "Main Menu" or a "Message" screen.
System.out.println (TRACE_INPUT_OUTPUT);
j2hodconn.execute(interactionSpec, input, output);
// Check for which output screen: "Main Menu" or "Message"
boolean bOK = output.checkBytes("Press Enter to continue.", 19, 2, 19, 25, false, false);
if (bOK == true)
{ // In "Message" screen, so need to press "ENTER" to get to "Main Menu"
input = null;
interactionSpec = new J2HODInteractionSpec();
interactionSpec.setKeyName(J2HODInteractionSpec.ENTER);
System.out.println (TRACE_OUTPUT_ONLY);
j2hodconn.execute(interactionSpec, input, output);
}
// Verify that output screen is in "Main Menu" screen
output.checkBytes("AS/400 Main Menu", 1, 33, 1, 48, false, true);
}
catch (java.lang.Throwable exception) {
throw new javax.resource.ResourceException("Logon exception");
}
System.out.println(TRACE_ENTRY + TRACE_HEADER + ".logon()] with userName: " + userName);
} // end logon method
// Handles Logging off
public void logoff(Connection connection)
{
System.out.println(TRACE_ENTRY + TRACE_HEADER + ".logoff()]");
J2HODConnection j2hodconn = null;
try {
j2hodconn = (J2HODConnection)connection;
}
catch (java.lang.Throwable exception) {
System.out.println("Invoked using invalid Connection specified.");
}
// Create records for Input and Output
J2HODScreenRecord input = null;
J2HODScreenRecord output = new J2HODScreenRecord(24, 80);
try {
// Receive current screen to check for "90. Sign off" menu availability
J2HODInteractionSpec interactionSpec = new J2HODInteractionSpec();
interactionSpec.setInteractionVerb(new Integer(J2HODInteractionSpec.SYNC_RECEIVE));
// Execute interaction
System.out.println (TRACE_OUTPUT_ONLY);
j2hodconn.execute(interactionSpec, input, output);
// Check to see if "90. Sign off" menu is available
boolean bOK = output.checkBytes("90. Sign off", -1, -1, -1, -1, false, false);
// send PF3 to exit the current screen until "90. Sign off"
// menu is available in the new output screen
while (!bOK)
{
input = null;
interactionSpec = new J2HODInteractionSpec();
interactionSpec.setKeyName(J2HODInteractionSpec.PF3);
// Execute interaction
System.out.println (TRACE_OUTPUT_ONLY);
j2hodconn.execute(interactionSpec, input, output);
bOK = output.checkBytes("90. Sign off", -1, -1, -1, -1, false, false);
}
// "90. Sign off" menu is now available
// Take previous output as an input and create a new record for a new output
input = output;
output = new J2HODScreenRecord(24, 80);
// Send logoff command. No output checking is done here
input.setString("90", 20, 7); //command
interactionSpec = new J2HODInteractionSpec();
interactionSpec.setInteractionVerb(new Integer(J2HODInteractionSpec.SYNC_SEND));
interactionSpec.setScreenName("Logon screen"); //output screen name
// Execute interaction
System.out.println (TRACE_INPUT_OUTPUT);
j2hodconn.execute(interactionSpec, input, output);
}
catch (java.lang.Throwable exception) {
System.out.println("***ERROR*** Logoff exception");
}
System.out.println(TRACE_EXIT + TRACE_HEADER + ".logoff()]");
}
}
/**
* An implementation of the simple application client. It accesses
* the J2EE Connector directly without providing any additional
* Quality of Service. It uses above logon/logoff class to handle logging on and logging off
* from the EIS.
*/
// Import necessary packages and classes needed
import java.util.*;
import com.ibm.connector2.hod.*;
import javax.naming.*;
import javax.naming.directory.*;
import java.util.Hashtable;
import com.ibm.eNetwork.ECL.*;
import com.ibm.eNetwork.ECL.screenreco.*;
public class J2HODConnectorSample2
{
public static void main(String[] args)
{
try {
// Create a ManagedConnectionFactory for Telnet5250 connection
J2HOD5250ManagedConnectionFactory mcf = new J2HOD5250ManagedConnectionFactory();
// Set properties of the ManagedConnectionFactory
mcf.setTraceLevel(new Integer(J2HODBaseManagedConnectionFactory.RAS_TRACE_ENTRY_EXIT));
mcf.setServerName("a_host_name");
// Specify which class is handling Logon/Logoff process
mcf.setLogonLogoffClassName("J2HODScreenVMLogonLogoff");
// Set admin logWriter to System.err
mcf.setLogWriter(new java.io.PrintWriter(System.err));
// Create EIS specific connection factory
J2HODConnectionFactory cf = (J2HODConnectionFactory)mcf.createConnectionFactory();
// set up properties
J2HODConnectionSpec connectionSpec = new J2HODConnectionSpec();
connectionSpec.setUserName("user_ID");
connectionSpec.setPassword("Password");
// Create J2HODConnection - triggers to start the logon method
J2HODConnection j2hodconn = (J2HODConnection)cf.getConnection(connectionSpec);
System.out.println("getConnection successfull: " + j2hodconn.toString());
// Create interaction
J2HODInteraction interaction = (J2HODInteraction)j2hodconn.createInteraction();
// Repeat the process of using input and output records, screenDesc, v, interaction,
// and interactionSpec from ":Repeat begin" to ":Repeat end" to execute different
// commands. Resulting output record should be used as an input record for the
// next command.
// :Repeat begin
// Create records for input and output
J2HODScreenRecord r1 = new J2HODScreenRecord(24, 80);
J2HODScreenRecord r2 = new J2HODScreenRecord(24, 80);
Vector v = new Vector();
ECLScreenDesc screenDesc = new ECLScreenDesc();
// Place an input command in input record
r1.setString("1", 20, 7);
// Add screen descriptions to recognize from the output screen record
screenDesc.Clear();
screenDesc.AddOIAInhibitStatus(ECLScreenDesc.NOTINHIBITED);
screenDesc.AddStringInRect("User Tasks", 1, 36, 1, 45, false);
v.add(screenDesc);
// Create interactionSpec and set its properties such as screen descriptors and key name
J2HODInteractionSpec interactionSpec = new J2HODInteractionSpec();
interactionSpec.setScreenDescriptors(v);
interactionSpec.setKeyName(J2HODInteractionSpec.ENTER);
// Execute interaction
interaction.execute(interactionSpec, r1, r2);
// Check the current output
r2.checkBytes("User Tasks", 1, 36, 1, 45, false, true);
// go back where ":Repeat begin" starts and go through a similar process to set the command
// and screen descriptors then execute the interaction.
// :Repeat end
// When all the executions are done and ready to end follow the rest to end
// Close interaction
interaction.close();
// Close J2HODConnection - triggers to start the logoff method
j2hodconn.close();
} catch (javax.resource.ResourceException exn2) {
System.out.println("***ERROR*** Operation failed: " + exn2);
} catch (Exception ex) {
System.out.println("***ERROR*** Operation failed: " + ex);
}
System.exit(0);
}
}
[ Top of Page | Previous Page | Next Page | Table of Contents ]