com.ibm.as400.access.EnvironmentVariableList Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400 Show documentation
Show all versions of jt400 Show documentation
The Open Source version of the IBM Toolbox for Java
The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: EnvironmentVariableList.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) 2000-2003 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.Serializable;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
/**
The EnvironmentVariableList class represents a list of IBM i system-level environment variables.
This class can only access system-level environment variables. You must have *JOBCTL special authority to add, change, or delete system-level environment variables.
This example gets the list of environment variables as a java.util.Properties object:
* AS400 system = new AS400("mysystem");
* EnvironmentVariableList evList = new EnvironmentVariableList(system);
* Properties p = evList.getProperties();
This example uses an Enumeration to print the list of environment variable names and values:
* AS400 system = new AS400("mysystem");
* EnvironmentVariableList evList = new EnvironmentVariableList(system);
* Enumeration list = evList.getEnvironmentVariables();
* while (list.hasMoreElements())
* {
* EnvironmentVariable ev = (EnvironmentVariable)list.nextElement();
* System.out.println(ev.getName() + "=" + ev.getValue());
* }
@see EnvironmentVariable
**/
// Implementation note:
// * There is currently no API to get a list of job-level environment variables. This is not available since C programs can get the list via the ENVIRON environment variable.
public class EnvironmentVariableList implements Serializable
{
static final long serialVersionUID = 4L;
private AS400 system_ = null;
private transient ServiceProgramCall spc_ = null;
// List of property change event bean listeners.
private transient PropertyChangeSupport propertyChangeListeners_ = null; // Set on first add.
/**
Constructs a EnvironmentVariableList object.
**/
public EnvironmentVariableList()
{
super();
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Constructing EnvironmentVariableList object.");
}
/**
Constructs a EnvironmentVariableList object.
@param system The system.
**/
public EnvironmentVariableList(AS400 system)
{
this();
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, " system: " + system);
if (system == null)
{
Trace.log(Trace.ERROR, "Parameter 'system' is null.");
throw new NullPointerException("system");
}
system_ = system;
}
/**
Adds a PropertyChangeListener. The specified PropertyChangeListener's propertyChange() method will be called each time the value of any bound property is changed.
@param listener The listener object.
**/
public void addPropertyChangeListener(PropertyChangeListener listener)
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Adding property change listener.");
if (listener == null)
{
Trace.log(Trace.ERROR, "Parameter 'listener' is null.");
throw new NullPointerException("listener");
}
synchronized (this)
{
// If first add.
if (propertyChangeListeners_ == null)
{
propertyChangeListeners_ = new PropertyChangeSupport(this);
}
propertyChangeListeners_.addPropertyChangeListener(listener);
}
}
/**
Returns an enumeration that contains an EnvironmentVariable object for each environment variable on the system.
* @return Enumeration of environment variables
@exception AS400SecurityException If a security or authority error occurs.
@exception ErrorCompletingRequestException If an error occurs before the request is completed.
@exception InterruptedException If this thread is interrupted.
@exception IOException If an error occurs while communicating with the system.
@exception ObjectDoesNotExistException If the object does not exist on the system.
**/
public Enumeration getEnvironmentVariables() throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
return Collections.enumeration(getEnvironmentVariablesList());
}
/**
Returns an List that contains an EnvironmentVariable object for each environment variable on the system.
* @return List of environment variables
@exception AS400SecurityException If a security or authority error occurs.
@exception ErrorCompletingRequestException If an error occurs before the request is completed.
@exception InterruptedException If this thread is interrupted.
@exception IOException If an error occurs while communicating with the system.
@exception ObjectDoesNotExistException If the object does not exist on the system.
**/
public List getEnvironmentVariablesList() throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Getting environment variables.");
if (spc_ == null)
{
spc_ = EnvironmentVariable.setupServiceProgramCall(system_);
}
ProgramParameter[] parameters = new ProgramParameter[]
{
new ProgramParameter(ProgramParameter.PASS_BY_REFERENCE, 4096),
new ProgramParameter(ProgramParameter.PASS_BY_REFERENCE, new byte[] { 0x00, 0x00, 0x10, 0x00 }, 4),
new ProgramParameter(ProgramParameter.PASS_BY_REFERENCE, 1024),
new ProgramParameter(ProgramParameter.PASS_BY_REFERENCE, new byte[] { 0x00, 0x00, 0x04, 0x00 }, 4),
EnvironmentVariable.nullParameter
};
int rv = EnvironmentVariable.runServiceProgram(spc_, "Qp0zGetAllSysEnv", parameters, EnvironmentVariable.RV_ENOSPC, EnvironmentVariable.RV_ENOENT);
int actualListBufferSize = BinaryConverter.byteArrayToInt(parameters[1].getOutputData(), 0);
int actualCcsidBufferSize = BinaryConverter.byteArrayToInt(parameters[3].getOutputData(), 0);
// If the size came back as ENOSPC, then call it again with the correct amount of bytes.
if (rv == EnvironmentVariable.RV_ENOSPC)
{
if (Trace.traceOn_) Trace.log(Trace.INFORMATION, "ENOSPC returned, getting environment variable list again with " + actualListBufferSize + " bytes for the list and " + actualCcsidBufferSize + " bytes for the ccsids.");
try
{
parameters[0].setOutputDataLength(actualListBufferSize);
parameters[1].setInputData(BinaryConverter.intToByteArray(actualListBufferSize));
parameters[2].setOutputDataLength(actualCcsidBufferSize);
parameters[3].setInputData(BinaryConverter.intToByteArray(actualCcsidBufferSize));
}
catch (PropertyVetoException e)
{
Trace.log(Trace.ERROR, "Unexpected PropertyVetoException:", e);
throw new InternalErrorException(InternalErrorException.UNEXPECTED_EXCEPTION);
}
EnvironmentVariable.runServiceProgram(spc_, "Qp0zGetAllSysEnv", parameters, 0, 0);
}
// If ENOENT is returned, then there are no environment variables.
else if (rv == EnvironmentVariable.RV_ENOENT)
{
return new LinkedList();
}
// Build up a List of EnvironmentVariable objects.
List list = new LinkedList();
int offsetIntoListBuffer = 0;
int offsetIntoCcsidBuffer = 0;
byte[] listBufferBytes = parameters[0].getOutputData();
byte[] ccsidBufferBytes = parameters[2].getOutputData();
do
{
// Find the EBCDIC equals (=).
int equalPosition = offsetIntoListBuffer;
while (listBufferBytes[equalPosition] != 0x7E) ++equalPosition;
// Find the null.
int nullPosition = equalPosition;
while (listBufferBytes[nullPosition] != 0) ++nullPosition;
// Get the name, make null terminated.
byte[] nameBytes = new byte[equalPosition - offsetIntoListBuffer + 1];
System.arraycopy(listBufferBytes, offsetIntoListBuffer, nameBytes, 0, nameBytes.length - 1);
// Get the value, make null terminated.
byte[] valueBytes = new byte[nullPosition - equalPosition];
System.arraycopy(listBufferBytes, equalPosition + 1, valueBytes, 0, valueBytes.length - 1);
// Get the CCSID.
int ccsid = BinaryConverter.byteArrayToInt(ccsidBufferBytes, offsetIntoCcsidBuffer);
// Create the EnvironmentVariable object, add it to vector.
list.add(new EnvironmentVariable(system_, spc_, nameBytes, valueBytes, ccsid));
// Get ready for the next iteration.
offsetIntoListBuffer = nullPosition + 1;
offsetIntoCcsidBuffer += 4;
// Until ending null terminator.
} while (listBufferBytes[offsetIntoListBuffer] != 0);
return list;
}
/**
Returns a new Properties object which contains an entry for each environment variable in the list.
@return The new Properties object.
@exception AS400SecurityException If a security or authority error occurs.
@exception ErrorCompletingRequestException If an error occurs before the request is completed.
@exception InterruptedException If this thread is interrupted.
@exception IOException If an error occurs while communicating with the system.
@exception ObjectDoesNotExistException If the object does not exist on the system.
**/
public Properties getProperties() throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Getting environment variables as Properties.");
Properties properties = new Properties();
Enumeration list = getEnvironmentVariables();
while (list.hasMoreElements())
{
EnvironmentVariable environmentVariable = (EnvironmentVariable)list.nextElement();
properties.put(environmentVariable.getName(), environmentVariable.getValue());
}
return properties;
}
/**
Returns the system on which the environment variable list exists.
@return The system on which the environment variable list exists. If the system has not been set, null is returned.
**/
public AS400 getSystem()
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Getting system: " + system_);
return system_;
}
/**
Removes a PropertyChangeListener.
@param listener The listener object.
**/
public void removePropertyChangeListener(PropertyChangeListener listener)
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Removing property change listener.");
if (listener == null)
{
Trace.log(Trace.ERROR, "Parameter 'listener' is null.");
throw new NullPointerException("listener");
}
// If we have listeners.
if (propertyChangeListeners_ != null)
{
propertyChangeListeners_.removePropertyChangeListener(listener);
}
}
/**
Sets the value of each environment variable defined in a Properties object.
@param properties The Properties object.
@exception AS400SecurityException If a security or authority error occurs.
@exception ErrorCompletingRequestException If an error occurs before the request is completed.
@exception InterruptedException If this thread is interrupted.
@exception IOException If an error occurs while communicating with the system.
@exception ObjectDoesNotExistException If the object does not exist on the system.
**/
public void setProperties(Properties properties) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
// Set string type to -1 to signal lookup based on CCSID.
setProperties(properties, -1);
}
/**
Sets the value of each environment variable defined in a Properties object.
@param properties The Properties object.
@param stringType The environment variable bidi string type, as defined by the CDRA (Character Data Representation Architecture). See {@link com.ibm.as400.access.BidiStringType BidiStringType} for more information and valid values.
@exception AS400SecurityException If a security or authority error occurs.
@exception ErrorCompletingRequestException If an error occurs before the request is completed.
@exception InterruptedException If this thread is interrupted.
@exception IOException If an error occurs while communicating with the system.
@exception ObjectDoesNotExistException If the object does not exist on the system.
**/
public void setProperties(Properties properties, int stringType) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Setting environment variables from Properties.");
if (properties == null)
{
Trace.log(Trace.ERROR, "Parameter 'properties' is null.");
throw new NullPointerException("properties");
}
if (spc_ == null)
{
spc_ = EnvironmentVariable.setupServiceProgramCall(system_);
}
if (stringType == -1) stringType = AS400BidiTransform.getStringType(system_.getCcsid());
Enumeration propertyNames = properties.propertyNames();
while (propertyNames.hasMoreElements())
{
String propertyName = (String)propertyNames.nextElement();
EnvironmentVariable environmentVariable = new EnvironmentVariable(system_, spc_, propertyName);
environmentVariable.setValue(properties.getProperty(propertyName), 0, stringType);
}
}
/**
Sets the system for the environment variable list. The system cannot be changed once a connection is made to the system.
@param system The system on which the environment variable list exists.
**/
public void setSystem(AS400 system)
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Setting system: " + system);
if (system == null)
{
Trace.log(Trace.ERROR, "Parameter 'system' is null.");
throw new NullPointerException("system");
}
if (spc_ != null)
{
Trace.log(Trace.ERROR, "Cannot set property 'system' after connect.");
throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_CHANGED);
}
if (propertyChangeListeners_ == null)
{
system_ = system;
}
else
{
AS400 oldValue = system_;
AS400 newValue = system;
system_ = newValue;
propertyChangeListeners_.firePropertyChange("system", oldValue, newValue);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy