src.utilities.RunJavaApplication Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400-jdk8 Show documentation
Show all versions of jt400-jdk8 Show documentation
The Open Source version of the IBM Toolbox for Java
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: RunJavaApplication.java
//
// The source code contained herein is licensed under the IBM Public License
// Version 1.0, which has been approved by the Open Source Initiative.
// Copyright (C) 1997-2000 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package utilities;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400SecurityException;
import com.ibm.as400.access.JavaApplicationCall;
import com.ibm.as400.access.Trace;
import java.beans.PropertyVetoException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import java.util.Vector;
/**
* Demonstrates the use of {@link com.ibm.as400.access.JavaApplicationCall JavaApplicationCall}.
* It gathers information from the user about the class to run, then uses a
* JavaApplicationCall object to run the program on the IBM i system's JVM. It
* uses the capabilities of JavaApplicationCall to send input to the Java
* program and displays output the Java program writes to standard out and
* standard error.
*
*
* RunJavaApplication has three command line parameters. All parameters are optional.
*
*
* - system - the name of the system.
*
- userid - run the Java program under this userid.
*
- password - the password of the user.
*
*
*
* Once started, four commands can be run:
*
* - set - set options to define the JVM environment on the system.
*
- java - run a Java application on IBM i system.
*
- help - display help.
*
- quit - end the application.
*
*
*
* You can set the following options via the set command. For more information
* on each option display the on-line help for the Java command on the system.
*
* - Classpath - the CLASSPATH environment variable on the system.
*
- DefaultPort - the default port for communicating standard in, standard out
* and standard error between the client and the server Java program.
*
- FindPort - Indicates to search for a port if the specified port is in use
*
- Interpret - Indicates if all Java class files should be run interpretively.
*
- Optimize - Optimization level of the Java classes that are not already optimized.
*
- Options - Options to pass to the IBM i system's JVM.
*
- SecurityCheckLevel - The level of warnings for writable directories in CLASSPATH.
*
- GarbageCollectionFrequency - The relative frequency that garbage collection runs.
*
- GarbageCollectionInitialSize - The initial size, in kilobytes, of the garbage collection heap.
*
- GarbageCollectionMaximumSize - The maximum size, in kilobytes, that the garbage collection heap can grow to.
*
- GarbageCollectionPriority - The priority of the tasks running garbage collection.
*
*
*
* The format of the java command is:
*
*
* java [-classpath=<value>] [-verbose] [-D<property>=<value> [...]] class [<programParameter1> [...]]
*
*
* @deprecated No longer supported.
**/
public class RunJavaApplication
{
private static JavaApplicationCall runMain_ = null;
// Where MRI comes from.
private static ResourceBundle resources_ = ResourceBundle.getBundle("utilities.UTMRI");
private static RunJavaApplicationThread errorThread_ = null;
private static RunJavaApplicationThread inputThread_ = null;
private static RunJavaApplicationThread outputThread_ = null;
private static RunJavaApplicationThread runApplication_ = null;
private static Vector inputLines_ = new Vector();
private static String classpath_ = "";
private static String[] option_ = {"*NONE"};
/**
* Runs Java programs on the IBM i system's JVM.
* @param parameters The command line parameters. See the prolog
* of this class for information on the command line parameters.
**/
public static void main(String[] parameters)
{
RunJavaApplication rja = null;
String inputString = null;
AS400 as400 = new AS400();
try
{
if (parameters.length > 0)
as400.setSystemName(parameters[0]);
if (parameters.length > 1)
as400.setUserId(parameters[1]);
if (parameters.length > 2)
as400.setPassword(parameters[2]);
runMain_ = new JavaApplicationCall(as400);
// starts input,output,error thread
inputThread_ = new RunJavaApplicationThread(runMain_, RunJavaApplicationThread.INPUT);
inputThread_.start();
outputThread_ = new RunJavaApplicationThread(runMain_, RunJavaApplicationThread.OUTPUT);
outputThread_.start();
errorThread_ = new RunJavaApplicationThread(runMain_, RunJavaApplicationThread.ERROR);
errorThread_.start();
runApplication_ = new RunJavaApplicationThread(runMain_, RunJavaApplicationThread.RUN_APPLICATION);
System.out.print(resources_.getString("REMOTE_PROMPT"));
while(true)
{
String is = null;
if (inputLines_.size() > 0)
{
is = (String)inputLines_.elementAt(0);
inputLines_.removeElementAt(0);
}
if (is != null)
{
if (!runApplication_.isAlive())
{
inputString = is.toUpperCase().trim();
if ((inputString.equals("QUIT")) || (inputString.equals("Q"))) // quit
{
System.exit(0);
}
else if (inputString.startsWith("JAVA ")) // java
{
if (preProcessJavaCommand(runMain_, is.substring(4)))
{
runApplication_ = new RunJavaApplicationThread(runMain_, RunJavaApplicationThread.RUN_APPLICATION);
runApplication_.start();
}
else
showPrompt();
}
else if (inputString.startsWith("SET ")) // set properties
{
String pair = is.substring("SET ".length());
String property = null;
String value = null;
int index = pair.indexOf("=");
if ((index > 0) && (!pair.endsWith("=")))
{
property = pair.substring(0,index);
value = pair.substring(index+1);
property = property.trim();
setProperty(runMain_, property.toUpperCase(), value);
}
else
{
System.out.println(resources_.getString("REMOTE_ERR_SET"));
}
showPrompt();
}
else if ((inputString.equals("HELP")) ||
(inputString.equals("?")) ||
(inputString.equals("H"))) // help
{
showHelp();
showPrompt();
}
else if (inputString.equals("D")) // display properties
{
displayProperties();
showPrompt();
}
else
{
if (inputString.equals("")); // enter
else if (inputString.equals("JAVA"))
System.out.println(resources_.getString("REMOTE_ERR_JAVA"));
else if (inputString.equals("SET"))
{
displayProperties();
// System.out.println(resources_.getString("REMOTE_ERR_SET"));
}
else
System.out.println(getMRIResource().getString("REMOTE_BAD_COMMAND"));
showPrompt();
}
}
else
{ // send the string to system
runMain_.sendStandardInString(is);
}
}
Thread.sleep(100);
} // end of the loop
}
catch (Throwable e)
{
e.printStackTrace();
}
}
/**
Displays the properties.
**/
private static void displayProperties()
{
StringBuffer optionString = new StringBuffer();
for (int i = 0 ; i < option_.length ; i++) {
optionString.append(option_[i]);
optionString.append(" ");
}
System.out.println(getMRIResource().getString("REMOTE_D_LINE1"));
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE2") + runMain_.getSecurityCheckLevel());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE3") + classpath_);
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE4") + runMain_.getGarbageCollectionFrequency());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE5") + runMain_.getGarbageCollectionInitialSize());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE6") + runMain_.getGarbageCollectionMaximumSize());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE7") + runMain_.getGarbageCollectionPriority());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE8") + runMain_.getInterpret());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE9") + runMain_.getOptimization());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE10") + optionString.toString());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE11") + runMain_.getDefaultPort());
System.out.println(" "+getMRIResource().getString("REMOTE_D_LINE12") + runMain_.isFindPort());
}
/**
Loads the resource bundle if not already done.
@return The resource bundle for this class.
**/
private static ResourceBundle getMRIResource()
{
if (resources_ == null)
resources_ = ResourceBundle.getBundle("utilities.UTMRI");
return resources_;
}
/**
Returns input buffer.
@return The input buffer used by command line input.
**/
protected static Vector getInputBuffer()
{
return inputLines_;
}
/**
Preprocess the java command.
**/
private static boolean preProcessJavaCommand(JavaApplicationCall jac, String inputStr)
{
StringTokenizer strToken = new StringTokenizer(inputStr.trim() , " ");
int paramNum = strToken.countTokens();
// save strings of strToken into Vector command.
Vector command = new Vector();
for (int i = 0 ; i < paramNum ; i++)
command.addElement(strToken.nextToken());
// 1. find class name
int indexOfClass = 0;
boolean classExist = false;
while(indexOfClass < paramNum)
{
String str = (String)command.elementAt(indexOfClass);
if (str.indexOf("-") == -1)
{
classExist = true;
break;
}
indexOfClass++;
}
if (!classExist)
{
System.out.println(resources_.getString("REMOTE_ERR_JAVA"));
return false;
}
else
{
// 2. handle -classpath, -verbose, -D
int numOfClasspath = 0;
int numOfVerbose = 0;
int numOfProperty = 0;
boolean tempClasspathExist = false;
boolean verboseExist = false;
// String properties = "";
Properties properties = new Properties();;
for (int i = 0 ; i < indexOfClass ; i++)
{
String env = (String)command.elementAt(0);
command.removeElementAt(0);
String upperEnv = env.toUpperCase();
if (upperEnv.indexOf("-CLASSPATH=") == 0)
{
numOfClasspath++;
if (numOfClasspath > 1)
{
System.out.println(resources_.getString("REMOTE_ERR_JAVA"));
return false;
}
try
{
int index = env.indexOf("=");
String path = env.substring(index);
if (!(path.endsWith("=") || index <0))
path = path.replace((char)('='),(char)(' ')) + " ";
else
throw new Exception("classPath");
jac.setClassPath(path.trim());
tempClasspathExist = true;
}
catch (Exception e)
{
System.out.println(resources_.getString("REMOTE_ERR_JAVA"));
return false;
}
}
else if (upperEnv.indexOf("-VERBOSE") == 0)
{
numOfVerbose++;
if (numOfVerbose > 1)
{
System.out.println(resources_.getString("REMOTE_ERR_JAVA"));
return false;
}
String[] curOption = jac.getOptions();
boolean alreadyExist = false;
for (int j = 0 ; j < curOption.length ; j++)
if (curOption[j].equals("*VERBOSE"))
{
alreadyExist = true;
verboseExist = true;
break;
}
try
{
if (!alreadyExist)
{
String[] newOpt = new String[curOption.length + 1];
for (int optidx = 0 ; optidx < curOption.length ; optidx++)
newOpt[optidx] = curOption[optidx];
newOpt[newOpt.length-1] = "*VERBOSE";
jac.setOptions(newOpt);
verboseExist = true;
}
}
catch (PropertyVetoException e)
{
System.out.println(resources_.getString("REMOTE_ERR_JAVA"));
return false;
}
}
else if (upperEnv.indexOf("-D") == 0)
{
try
{
int len = "-D".length();
String prop =env.substring(len);
int index = prop.indexOf("=");
if (!(prop.endsWith("=") || index <=0))
properties.put(prop.substring(0,index), prop.substring(index+1));
else
throw new Exception("properties");
}
catch(Exception e)
{
System.out.println(resources_.getString("REMOTE_ERR_JAVA"));
return false;
}
}
else
{
System.out.println(resources_.getString("REMOTE_ERR_JAVA"));
return false;
}
}
// set java application, -D
String application = (String)command.elementAt(0);
command.removeElementAt(0);
try
{
if (!tempClasspathExist)
jac.setClassPath(classpath_);
if (!verboseExist)
jac.setOptions(option_);
if (!properties.isEmpty())
jac.setProperties(properties);
jac.setJavaApplication(application);
}
catch(Exception e)
{
}
// 3. handle parameters of java application
Vector appParm = new Vector();
for (int parmNum = 0 ; parmNum < command.size(); parmNum++)
appParm.addElement((String)command.elementAt(parmNum));
try
{
if (appParm.size() > 0)
{
String[] parmArray = new String[appParm.size()];
for (int i = 0 ; i < appParm.size() ; i++)
parmArray[i] = (String)appParm.elementAt(i);
jac.setParameters(parmArray);
}
}
catch (Exception e)
{
}
}
return true;
}
/**
Sets JavaApplicationCall object's property.
**/
private static void setProperty(JavaApplicationCall jac, String property, String value)
{
try
{
value = value.trim();
if (value.length() == 0)
{
System.out.println(resources_.getString("REMOTE_ERR_SET"));
}
else
{
if (property.equals("CLASSPATH"))
{
jac.setClassPath(value);
classpath_ = value;
}
else if (property.equals("SECURITYCHECKLEVEL"))
jac.setSecurityCheckLevel(value);
else if (property.equals("OPTION"))
{
StringTokenizer st = new StringTokenizer(value.trim()," ");
String[] options = new String[st.countTokens()];
for (int i = 0 ; i < options.length ; i++)
options[i] = st.nextToken();
jac.setOptions(options);
option_ = options;
}
else if (property.equals("INTERPRET"))
jac.setInterpret(value);
else if (property.equals("GARBAGECOLLECTIONINITIALSIZE"))
{
Integer val = new Integer(value);
jac.setGarbageCollectionInitialSize(val.intValue());
}
else if (property.equals("GARBAGECOLLECTIONMAXIMUMSIZE"))
jac.setGarbageCollectionMaximumSize(value);
else if (property.equals("GARBAGECOLLECTIONFREQUENCY"))
{
Integer val = new Integer(value);
jac.setGarbageCollectionFrequency(val.intValue());
}
else if (property.equals("GARBAGECOLLECTIONPRIORITY"))
{
Integer val = new Integer(value);
jac.setGarbageCollectionPriority(val.intValue());
}
else if (property.equals("OPTIMIZE"))
jac.setOptimization(value);
else if (property.equals("DEFAULTPORT"))
{
Integer val = new Integer(value);
jac.setDefaultPort(val.intValue());
}
else if (property.equals("FINDPORT"))
{
String val = value.toUpperCase();
if (val.equals("TRUE"))
jac.setFindPort(true);
else if (val.equals("FALSE"))
jac.setFindPort(false);
else
System.out.println(getMRIResource().getString("REMOTE_PORT_VALUE_ERROR"));
}
else
System.out.println(getMRIResource().getString("REMOTE_SET_PROPERTY_1")
+ " "+property + " "
+ getMRIResource().getString("REMOTE_SET_PROPERTY_2"));
}
}
catch (Throwable e)
{
System.out.println(e);
}
}
/**
Displays command syntax.
**/
private static void showHelp()
{
//System.out.println(getMRIResource().getString("REMOTE_HELP_LINE0"));
System.out.println(getMRIResource().getString("REMOTE_HELP_LINE1"));
System.out.println(" " + getMRIResource().getString("REMOTE_HELP_LINE2"));
System.out.println(" " + getMRIResource().getString("REMOTE_HELP_LINE3"));
System.out.println(getMRIResource().getString("REMOTE_HELP_LINE4"));
System.out.println(" " + getMRIResource().getString("REMOTE_HELP_LINE5"));
System.out.println(" " + getMRIResource().getString("REMOTE_HELP_LINE6"));
System.out.println(" " + getMRIResource().getString("REMOTE_HELP_LINE7"));
System.out.println(" " + getMRIResource().getString("REMOTE_HELP_LINE8"));
System.out.println(" " + getMRIResource().getString("REMOTE_HELP_LINE9"));
System.out.println(" " + getMRIResource().getString("REMOTE_HELP_LINE10"));
System.out.println(getMRIResource().getString("REMOTE_HELP_LINE11"));
System.out.println(getMRIResource().getString("REMOTE_HELP_LINE12"));
System.out.println(getMRIResource().getString("REMOTE_HELP_LINE13"));
}
private static void showPrompt()
{
System.out.println();
System.out.print(resources_.getString("REMOTE_PROMPT"));
}
}