com.ibm.as400.access.User Maven / Gradle / Ivy
Show all versions of jt400 Show documentation
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: User.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-2004 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.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;
import java.io.IOException;
import java.io.Serializable;
import java.util.Date;
import java.util.Calendar;
import java.util.TimeZone;
/**
* Represents a user profile object on the system.
*
* Note: User attribute information is cached internally in the User object, after the first retrieval. To force an
* update of the cached information, call {@link #refresh refresh()}.
*
* Note: Calling any of the attribute getters for the first time (for a given User instance) will result in an implicit
* call to {@link #refresh refresh()}. If any exceptions are thrown by the implicit refresh(), they are logged under
* trace category {@link Trace#ERROR Trace.ERROR} and ignored. However, if an exception occurs during an explicit
* call to refresh(), it will be thrown to the caller.
*
* Implementation note: This class internally calls the Retrieve User Information (QSYRUSRI) API for the methods that
* retrieve user profile information. In order to use those methods, the caller must have *READ authority to the user
* profile object. This class internally calls the Change User Profile (CHGUSRPRF) command for the methods that change
* user profile information. In order to use those methods, the caller must have security administrator (*SECADM)
* special authority, and object management (*OBJMGT) and use (*USE) authorities to the user profile being changed.
*
* @see DirectoryEntry
* @see UserList
* @see UserGroup
**/
public class User implements Serializable
{
static final long serialVersionUID = 5L;
// These need to be in this order so we can easily reference them from the code that parses the API return information in loadUserInformation().
private static final String[] SPECIAL_AUTHORITIES = new String[]
{
"*ALLOBJ",
"*SECADM",
"*JOBCTL",
"*SPLCTL",
"*SAVSYS",
"*SERVICE",
"*AUDIT",
"*IOSYSCFG"
};
/**
* Constant value representing the String "*NONE".
*
* @see #getAuthenticationMethods()
* @see #getGroupProfileName
* @see #getAttentionKeyHandlingProgram
* @see #getGroupAuthority
* @see #getInitialProgram
* @see #getLocaleJobAttributes
* @see #getLocalePathName
* @see #getObjectAuditingValue
* @see #getSpecialEnvironment
**/
public static final String NONE = "*NONE";
/**
* Constant value representing a special authority of "*ALLOBJ".
*
* @see #getSpecialAuthority
**/
public static final String SPECIAL_AUTHORITY_ALL_OBJECT = SPECIAL_AUTHORITIES[0];
/**
* Constant value representing a special authority of "*AUDIT".
*
* @see #getSpecialAuthority
**/
public static final String SPECIAL_AUTHORITY_AUDIT = SPECIAL_AUTHORITIES[6];
/**
* Constant value representing a special authority of "*IOSYSCFG".
*
* @see #getSpecialAuthority
**/
public static final String SPECIAL_AUTHORITY_IO_SYSTEM_CONFIGURATION = SPECIAL_AUTHORITIES[7];
/**
* Constant value representing a special authority of "*JOBCTL".
*
* @see #getSpecialAuthority
**/
public static final String SPECIAL_AUTHORITY_JOB_CONTROL = SPECIAL_AUTHORITIES[2];
/**
* Constant value representing a special authority of "*SAVSYS".
*
* @see #getSpecialAuthority
**/
public static final String SPECIAL_AUTHORITY_SAVE_SYSTEM = SPECIAL_AUTHORITIES[4];
/**
* Constant value representing a special authority of "*SECADM".
*
* @see #getSpecialAuthority
**/
public static final String SPECIAL_AUTHORITY_SECURITY_ADMINISTRATOR = SPECIAL_AUTHORITIES[1];
/**
* Constant value representing a special authority of "*SERVICE".
*
* @see #getSpecialAuthority
**/
public static final String SPECIAL_AUTHORITY_SERVICE = SPECIAL_AUTHORITIES[5];
/**
* Constant value representing a special authority of "*SPLCTL".
*
* @see #getSpecialAuthority
**/
public static final String SPECIAL_AUTHORITY_SPOOL_CONTROL = SPECIAL_AUTHORITIES[3];
// Shared error code parameter.
private static final ProgramParameter ERROR_CODE = new ProgramParameter(new byte[8]);
// The system where the user is located.
private AS400 system_ = null;
// User profile name.
private String name_ = null;
// Text description.
private String description_ = null;
// Group member indicator.
private boolean groupHasMember_ = false;
private CommandCall chgUsrPrf_ = null;
private CommandCall chgUsrAud_ = null;
private final static boolean COMMAND_CHGUSRPRF = true;
private final static boolean COMMAND_CHGUSRAUD = false;
// Flag that indicates that the above properties were set by UserList.
private boolean partiallyLoaded_ = false;
// Flag that indicates that all properties were set by loadUserInformation().
private boolean loaded_ = false;
// Flag that indicates that a connection has been made and the properties are frozen.
private boolean connected_ = false;
// List of property change event bean listeners, set on first add.
private transient PropertyChangeSupport propertyChangeListeners_ = null;
// List of vetoable change event bean listeners, set on first add.
private transient VetoableChangeSupport vetoableChangeListeners_ = null;
// User profile name.
private String userProfileName_;
// Previous sign-on date and time.
private Date previousSignedOnDate_;
// Sign-on attempts not valid.
private int signedOnAttemptsNotValid_;
// Status.
private String status_;
// Password change date (raw from API).
private byte[] passwordLastChangedDateBytes_;
// Password change date (converted).
private Date passwordLastChangedDate_;
// No password indicator.
private boolean noPassword_;
// Password expiration interval.
private int passwordExpirationInterval_;
// Date password expires (raw from API).
private byte[] passwordExpireDateBytes_;
// Date password expires (converted).
private Date passwordExpireDate_;
// Days until password expires.
private int daysUntilPasswordExpire_;
// Set password to expire.
private boolean passwordSetExpire_;
// User class name.
private String userClassName_;
// Special authorities.
private String[] specialAuthority_;
// Group profile name.
private String groupProfileName_;
// Owner.
private String owner_;
// Group authority.
private String groupAuthority_;
// Assistance level.
private String assistanceLevel_;
// Current library name.
private String currentLibraryName_;
// Initial menu (full IFS path).
private String initialMenu_;
// Initial program name (full IFS path).
private String initialProgram_;
// Limit capabilities.
private String limitCapabilities_;
// Display sign-on information.
private String displaySignOnInformation_;
// Limit device sessions.
private String limitDeviceSessions_;
// Keyboard buffering.
private String keyboardBuffering_;
// Maximum allowed storage. In V7R2 will be -2 if not *NOMAX but larger than 2G
private int maximumStorageAllowed_;
// Storage used.
private int storageUsed_;
// Maximum allowed storage in long
private long maximumStorageAllowedInLong_;//@P1A
// Storage used in long.
private long storageUsedInLong_;//@P1A
// Highest scheduling priority.
private int highestSchedulingPriority_;
// Job description (full IFS path).
private String jobDescription_;
// Accounting code.
private String accountingCode_;
// Message queue (full IFS path).
private String messageQueue_;
// Message queue delivery method.
private String messageQueueDeliveryMethod_;
// Message queue severity.
private int messageQueueSeverity_;
// Output queue (full IFS path).
private String outputQueue_;
// Print device.
private String printDevice_;
// Special environment.
private String specialEnvironment_;
// Attention-key-handling program (full IFS path).
private String attentionKeyHandlingProgram_;
// Language ID.
private String languageID_;
// Country or region ID.
private String countryID_;
// Character code set ID.
private int ccsid_;
// User options.
private String[] userOptions_;
// Sort sequence table (full IFS path).
private String sortSequenceTable_;
// Object auditing value.
private String objectAuditingValue_;
// User action audit level.
private String[] userActionAuditLevel_;
// Group authority type.
private String groupAuthorityType_;
// Supplemental groups.
private String[] supplementalGroups_;
// User ID number.
private long userID_;
// Group ID number.
private long groupID_;
// Home directory.
private String homeDirectory_;
// Locale job attributes.
private String[] localeJobAttributes_;
// Local path name.
private String localePathName_;
// Digital certificate indicator.
private boolean withDigitalCertificates_;
// Character identifier control.
private String chridControl_;
// Independent ASP name.
private String[] iaspNames_;
// Independent ASP maximum allowed storage.
private int[] iaspStorageAllowed_;
// Independent ASP Storage used.
private int[] iaspStorageUsed_;
// Local password management.
private boolean localPasswordManagement_;
// Password change block
private String pwdChangeBlock_;
// User entitlement required. (Note: No setter for this attribute)
private boolean userEntitlementRequired_;
// User expiration interval.
private int userExpirationInterval_;
// User expiration date (raw from API).
private byte[] userExpirationDateBytes_;
// User expiration date.
private Date userExpirationDate_;
// User expiration action. (Note: No setter for this attribute)
private String userExpirationAction_;
private transient DateTimeConverter dateConverter_;
private String jobDateFormat_;
private transient AS400Timestamp timestampConverter_;
private boolean authCollectionActive_;
private boolean authCollectionRepositoryExist_;
private boolean authCollectionDeleted_;
private String detailInSTRAUTCOL_;
private String[] libNamesInSTRAUTCOL_;
private String[] objectNamesInSTRAUTCOL_;
private String[] objectTypesInSTRAUTCOL_;
private String[] DLOObjectTypesInSTRAUTCOL_;
private String[] fileSystemObjectTypesInSTRAUTCOL_;
private String[] omitLibNamesInSTRAUTCOL_;
// MFA-related fields
/**
* Constant value representing an authentication method of "*TOTP".
*
* @see #getAuthenticationMethods
**/
public static final String AUTHENTICATION_METHOD_TOTP = "*TOTP";
/**
* Constant value representing an authentication method of "*REGFAC".
*
* @see #getAuthenticationMethods
**/
public static final String AUTHENTICATION_METHOD_REGFAC = "*REGFAC";
private String[] authenticationMethods_;
private int totpOptionalInterval_;
private int totpOptionalIntervalRemaining_;
private boolean totpKeyExistsIndicator_;
private Date totpKeyLastChangedDate_;
/**
* Constructs a User object.
**/
public User()
{
super();
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Constructing User object.");
}
/**
* Constructs a User object. Note that this constructor no longer throws any of the declared exceptions, but they
* remain for compatibility.
*
* @param system The system object representing the system on which the user profile exists.
* @param name The user profile name.
* @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 User(AS400 system, String name) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
super();
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Constructing User object, system: " + system + ", name: " + name);
if (system == null)
{
Trace.log(Trace.ERROR, "Parameter 'system' is null.");
throw new NullPointerException("system");
}
if (name == null)
{
Trace.log(Trace.ERROR, "Parameter 'name' is null.");
throw new NullPointerException("name");
}
name = name.trim();
if (name.length() > 10)
{
Trace.log(Trace.ERROR, "Length of parameter 'name' is not valid: '" + name + "'");
throw new ExtendedIllegalArgumentException("name (" + name + ")", ExtendedIllegalArgumentException.LENGTH_NOT_VALID);
}
// Perform simple validation of the user profile name.
// According to the help text for the CRTUSRPRF command:
// "A simple name starts with an alphabetic character followed by any of these characters: 0-9, A-Z, @, $, # and underscore (_)."
if (name.length() == 0 || !Character.isLetter(name.charAt(0)))
{
if (Trace.traceOn_) Trace.log(Trace.WARNING, "Value of parameter 'name' is not a valid user profile name: '" + name + "'");
// Note: The Domino plugin function of Web Navigator, in some situations, creates a User object with name "*NONE", which they subsequently validate. So we just trace a warning message and continue.
}
system_ = system;
name_ = name.toUpperCase();
}
// Called by UserList.getUsers() and a UserGroup constructor.
User(AS400 system, String name, boolean groupHasMember, String description)
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Constructing User object, system: " + system + ", name: " + name);
system_ = system;
name_ = name;
groupHasMember_ = groupHasMember;
description_ = description;
partiallyLoaded_ = true;
}
/**
* Adds a PropertyChangeListener. The specified PropertyChangeListener's
* {@link java.beans.PropertyChangeListener#propertyChange propertyChange()} method will be called each time the
* value of any bound property is changed.
*
* @param listener The listener.
* @see #removePropertyChangeListener
**/
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);
}
}
/**
* Adds a VetoableChangeListener. The specified VetoableChangeListener's
* {@link java.beans.VetoableChangeListener#vetoableChange vetoableChange()} method will be called each time the
* value of any constrained property is changed.
*
* @param listener The listener.
* @see #removeVetoableChangeListener
**/
public void addVetoableChangeListener(VetoableChangeListener listener)
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Adding vetoable change listener.");
if (listener == null)
{
Trace.log(Trace.ERROR, "Parameter 'listener' is null.");
throw new NullPointerException("listener");
}
synchronized (this)
{
// If first add.
if (vetoableChangeListeners_ == null)
vetoableChangeListeners_ = new VetoableChangeSupport(this);
vetoableChangeListeners_.addVetoableChangeListener(listener);
}
}
/**
* Determines if this user profile exists on the system. This method simply calls the CHKOBJ API and if no exception
* is thrown, the user profile exists; if a CPF9801 occurs then the user profile does not exist. Any other
* exceptions are still thrown.
*
* The value returned by this method is not cached. That is, every time exists() is called, a call to the system is
* made to determine if the user profile still exists.
*
* @return true if the profile exists, false if it does not.
* @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 boolean exists() throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Determining user existence.");
if (system_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting system.");
throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
if (name_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting name.");
throw new ExtendedIllegalStateException("name", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
try
{
String cmdString = "QSYS/CHKOBJ OBJ(QSYS/"+name_+") OBJTYPE(*USRPRF) AUT(*NONE)"; // not a threadsafe API prior to V5R3
CommandCall cmd = new CommandCall(system_, cmdString);
if (!cmd.run())
throw new AS400Exception(cmd.getMessageList());
}
catch (AS400Exception e)
{
AS400Message[] messages = e.getAS400MessageList();
if (messages.length == 1 && messages[0].getID().equalsIgnoreCase("CPF9801"))
return false;
throw e;
}
return true;
}
/**
* Retrieves the accounting code that is associated with this user.
*
* @return The accounting code that is associated with this user. If the user does not have an accounting code, an
* empty string ("") is returned.
* @see #setAccountingCode
**/
public String getAccountingCode()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return accountingCode_;
}
/**
* Retrieves the user interface that the user will use.
*
* @return The user interface that the user will use. Possible values are:
*
* - "*SYSVAL" - The system value QASTLVL determines which user interface the user is using.
*
- "*BASIC" - The Operational Assistant user interface.
*
- "*INTERMED" - The system user interface.
*
- "*ADVANCED" - The expert system user interface.
*
**/
public String getAssistanceLevel()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return assistanceLevel_;
}
/**
* Retrieves the attention key handling program for this user.
*
* @return The attention key handling program for this user. Possible values are:
*
* - "*SYSVAL" - The system value QATNPGM determines the user's attention key handling program.
*
- {@link #NONE NONE} - No attention key handling program is used.
*
- The fully qualified integrated file system path name of the attention key handling program.
*
* @see QSYSObjectPathName
**/
public String getAttentionKeyHandlingProgram()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return attentionKeyHandlingProgram_;
}
/**
* Retrieves the authentication methods for this user.
*
* @return The authentication methods for this user. Possible values are:
*
* - {@link #NONE NONE} - No additional authentication methods are used.
*
- {@link #AUTHENTICATION_METHOD_TOTP TOTP} - The time-based one-time password (TOTP) authentication
* method is used in addition to user ID and password.
*
- {@link #AUTHENTICATION_METHOD_REGFAC REGFAC} - The exit program registered under exit point
* QIBM_QSY_AUTH will be called during user authentication.
*
*/
public String[] getAuthenticationMethods()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return authenticationMethods_;
}
/**
* Retrieves the character code set ID to be used by the system for this user.
*
* @return The character code set ID to be used by the system for this user. Possible values are:
*
* - -2 - The system value QCCSID is used to determine the user's character code set ID.
*
- A character code set ID.
*
**/
public int getCCSID()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return ccsid_;
}
/**
* Retrieves the character identifier control for the user.
*
* @return The character identifier control for this user. Possible values are:
*
* - "*SYSVAL" - The system value QCHRIDCTL will be used to determine the CHRID control for this user.
*
- "*DEVD" - The *DEVD special value performs the same function as on the CHRID command parameter for
* display files, printer files, and panel groups.
*
- "*JOBCCSID" - The *JOBCCSID special value performs the same function as on the CHRID command
* parameter for display files, printer files, and panel groups.
*
* @see #setCHRIDControl
**/
public String getCHRIDControl()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return chridControl_;
}
/**
* Retrieves the country or region ID used by the system for this user.
*
* @return The country or region ID used by the system for this user. Possible values are:
*
* - "*SYSVAL" - The system value QCNTRYID is used to determine the user's country or region ID.
*
- A country or region ID.
*
* @see #setCountryID
**/
public String getCountryID()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return countryID_;
}
/**
* Retrieves the name of the user's current library.
*
* @return The name of the user's current library. Possible values are:
*
* - "*CRTDFT" - The user does not have a current library.
*
- A library name.
*
* @see #setCurrentLibraryName
**/
public String getCurrentLibraryName()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return currentLibraryName_;
}
/**
* Retrieves the number of days until the password will expire.
*
* @return The number of days until the password will expire. Possible values are:
*
* - 0 - The password is expired.
*
- 1-7 - The number of days until the password expires.
*
- -1 - The password will not expire in the next 7 days.
*
**/
public int getDaysUntilPasswordExpire()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return daysUntilPasswordExpire_;
}
/**
* Retrieves the descriptive text for the user profile. This value is pre-loaded into any User objects generated
* from a UserList object so that a call to the system is not required to retrieve this value. In the event that
* this User object was not constructed by a UserList, the description will need to be retrieved from the system via
* an implicit call to refresh().
*
* @return The descriptive text for the user profile.
* @see #setDescription
**/
public String getDescription()
{
if (!loaded_ && !partiallyLoaded_) loadUserInformation_SwallowExceptions();
return description_;
}
/**
* Retrieves the system distribution directory entry for the user profile, if one exists. The directory entry is
* retrieved from the system every time this method is called, so its value is unaffected by any call to refresh().
*
* @return The directory entry, or null if none exists.
* @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 DirectoryEntry getDirectoryEntry() throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
DirectoryEntryList list = new DirectoryEntryList(system_);
list.addSelection(DirectoryEntryList.USER_PROFILE, name_.toUpperCase());
DirectoryEntry[] entries = list.getEntries();
if (entries.length == 0)
return null;
return entries[0];
}
/**
* Retrieves whether the sign-on information display is shown when the user signs on.
*
* @return Whether the sign-on information display is shown when the user signs on. Possible values are:
*
* - "*SYSVAL" - The system value QDSPSGNINF determines if the sign-on information display is shown when
* the user signs on.
*
- "*YES" - The sign-on information display is shown when the user signs on.
*
- "*NO" - The sign-on information display is not shown when the user signs on.
*
* @see #setDisplaySignOnInformation
**/
public String getDisplaySignOnInformation()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return displaySignOnInformation_;
}
/**
* Retrieves the authority the user's group profile has to objects the user creates.
*
* @return The authority the user's group profile has to objects the user creates. Possible values are:
*
* - {@link #NONE NONE} - The group profile has no authority to the objects the user creates, or the user
* does not have a group profile.
*
- "*ALL" - The group profile has all authority to the objects the user creates.
*
- "*CHANGE" - The group profile has change authority to the objects the user creates.
*
- "*USE" - The group profile has use authority to the objects the user creates.
*
- "*EXCLUDE" - The group profile has exclude authority to the objects the user creates.
*
* @see #setGroupAuthority
**/
public String getGroupAuthority()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return groupAuthority_;
}
/**
* Retrieves the type of authority the user's group has to objects the user creates.
*
* @return The type of authority the user's group has to objects the user creates. Possible values are:
*
* - "*PRIVATE" - The group profile has a private authority to the objects the user creates, or the user
* does not have a group profile.
*
- "*PGP" - The group profile will be the primary group for objects the user creates.
*
* @see #setGroupAuthorityType
**/
public String getGroupAuthorityType()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return groupAuthorityType_;
}
/**
* Retrieves the group ID number for the user profile. The group ID number is used to identify the user when it is a
* group and a member of the group is using the integrated file system.
*
* @return The group ID number for the user profile. Possible values are:
*
* - 0 - user does not have a group ID (*NONE).
*
- A GID.
*
* @see #setGroupID(long)
* @see #setGroupID(String)
**/
public long getGroupID()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return groupID_;
}
/**
* Retrieves the group ID number for the user profile. The group ID number is used to identify the user when it is a
* group and a member of the group is using the integrated file system.
*
* @return The group ID number for the user profile. Possible values are:
*
* - 0 - user does not have a group ID (*NONE).
*
- A GID.
*
* @deprecated This method has been replaced by {@link #getGroupID getGroupID()} which returns a long.
**/
@Deprecated
public int getGroupIDNumber()
{
// The original code did not account for a group ID number being an unsigned 4 byte binary bigger than Integer.MAX_VALUE.
return (int)getGroupID();
}
/**
* Retrieves the name of the group profile.
*
* @return The name of the group profile. Possible values are:
*
* - {@link #NONE NONE} - The user does not have a group profile.
*
- The group profile name.
*
* @see #setGroupProfileName
**/
public String getGroupProfileName()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return groupProfileName_;
}
/**
* Retrieves the highest scheduling priority the user is allowed to have for each job submitted to the system.
*
* @return The highest scheduling priority the user is allowed to have for each job submitted to the system. The
* priority is a value from 0 to 9, with 0 being the highest priority.
* @see #setHighestSchedulingPriority
**/
public int getHighestSchedulingPriority()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return highestSchedulingPriority_;
}
/**
* Retrieves the home directory for this user profile. The home directory is the user's initial working directory.
* The working directory, associated with a process, is used in path name resolution in the directory file system
* for path names that do not begin with a slash (/).
*
* @return The home directory for this user profile.
* @see #setHomeDirectory
**/
public String getHomeDirectory()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return homeDirectory_;
}
/**
* Retrieves the list of independent auxiliary storage pool (IASP) names in use by this user.
*
* @return The list of independent auxiliary storage pool (IASP) names in use by this user. If no IASP name are in
* use by this user, a zero length array is returned. If the system operating system is not release V5R1M0
* or higher, null is returned.
* @see #getIASPStorageAllowed
* @see #getIASPStorageUsed
* @see AS400#getVRM
* @see AS400#generateVRM
**/
public String[] getIASPNames()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return iaspNames_;
}
/**
* Retrieves the maximum amount of auxiliary storage in kilobytes that can be assigned to store permanent object
* owned by this user on the given independant ASP.
*
* @param iaspName
* @return The maximum amount of auxiliary storage in kilobytes that can be assigned to store permanent object owned
* by this user on the given independant ASP. If the user does not have a maximum amount of allowed storage
* on the given independent ASP, -1 for *NOMAX is returned. If the system operating system is not release
* V5R1M0 or higher, or if the given IASP name is not listed for this user, -2 is returned.
* @see #getIASPNames
* @see #getIASPStorageUsed
**/
public int getIASPStorageAllowed(String iaspName)
{
if (iaspName == null)
{
Trace.log(Trace.ERROR, "Parameter 'iaspName' is null.");
throw new NullPointerException("iaspName");
}
if (!loaded_) loadUserInformation_SwallowExceptions();
if (iaspStorageAllowed_ != null)
{
for (int i = 0; i < iaspNames_.length; ++i)
{
if (iaspNames_[i].equals(iaspName))
return iaspStorageAllowed_[i];
}
}
return -2;
}
/**
* Retrieves the amount of auxiliary storage in kilobytes occupied by this user's owned objects on the given
* independent ASP.
*
* @param iaspName
* @return The amount of auxiliary storage in kilobytes occupied by this user's owned objects on the given
* independent ASP. If the system operating system is not release V5R1M0 or higher, or if the given IASP
* name is not listed for this user, -2 is returned.
* @see #getIASPNames
* @see #getIASPStorageAllowed
**/
public int getIASPStorageUsed(String iaspName)
{
if (iaspName == null)
{
Trace.log(Trace.ERROR, "Parameter 'iaspName' is null.");
throw new NullPointerException("iaspName");
}
if (!loaded_) loadUserInformation_SwallowExceptions();
if (iaspStorageUsed_ != null)
{
for (int i = 0; i < iaspNames_.length; ++i)
{
if (iaspNames_[i].equals(iaspName))
return iaspStorageUsed_[i];
}
}
return -2;
}
/**
* Retrieves the initial menu for the user.
*
* @return The initial menu for the user. Possible values are:
*
* - "*SIGNOFF" - The user is limited to running the initial program specified in this profile.
*
- The fully qualified integrated file system path name of the initial menu name.
*
* @see QSYSObjectPathName
* @see #setInitialMenu
**/
public String getInitialMenu()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return initialMenu_;
}
/**
* Retrieves the initial program for the user.
*
* @return The initial program for the user. Possible values are:
*
* - {@link #NONE NONE} - The user does not have an initial program.
*
- The fully qualified integrated file system path name of the initial program name.
*
* @see QSYSObjectPathName
* @see #setInitialProgram
**/
public String getInitialProgram()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return initialProgram_;
}
/**
* Retrieves the fully qualified integrated file system path name of the job description used for jobs that start
* through subsystem work station entries.
*
* @return The fully qualified integrated file system path name of the job description used for jobs that start
* through subsystem work station entries.
* @see QSYSObjectPathName
* @see #setJobDescription
**/
public String getJobDescription()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return jobDescription_;
}
/**
* Retrieves the keyboard buffering value that is used when a job is initialized for this user.
*
* @return The keyboard buffering value that is used when a job is initialized for this user. Possible values are:
*
* - "*SYSVAL" - The system value QKBDBUF determines the keyboard buffering value for this user.
*
- "*YES" - The type-ahead and attention-key buffering options are both on.
*
- "*NO" - The type-ahead and attention-key buffering options are not on.
*
- "*TYPEAHEAD" - The type-ahead option is on, but the attention-key buffering option is not.
*
* @see #setKeyboardBuffering
**/
public String getKeyboardBuffering()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return keyboardBuffering_;
}
/**
* Retrieves the language ID used by the system for this user.
*
* @return The language ID used by the system for this user. Possible values are:
*
* - "*SYSVAL" - The system value QLANGID will be used to determine the language ID.
*
- The language ID.
*
* @see #setLanguageID
**/
public String getLanguageID()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return languageID_;
}
/**
* Retrieves whether the user has limited capabilites.
*
* @return Whether the user has limited capabilites. Possible values are:
*
* - "*PARTIAL" - The user cannot change the initial program or current library.
*
- "*YES" - The user cannot change the initial menu, initial program, or current library. The user
* cannot run commands from the command line.
*
- "*NO" - The user is not limited.
*
* @see #setLimitCapabilities
**/
public String getLimitCapabilities()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return limitCapabilities_;
}
/**
* Retrieves whether the user is limited to one device session. Note: Values "0-9" are only valid when running to
* IBM i 6.1 or higher.
*
* @return Whether the user is limited to one device session. Possible values are:
*
* - "*SYSVAL" - The system value QLMTDEVSSN determines if the user is limited to one device session.
*
- "*YES" - The user is limited to one session.
*
- "*NO" - The user is not limited to one device session.
*
- "0" - The user is not limited to a specific number of device session. The value has the same meaning
* as *NO.
*
- "1" - The user is limited to a single device session. The value has the same meaning as *YES.
*
- "2-9" - The user is limited to the specified number of device sessions.
*
* @see #setLimitDeviceSessions
**/
public String getLimitDeviceSessions()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return limitDeviceSessions_;
}
/**
* Retrieves a list of the job attributes which are set from the user's locale path name.
*
* @return A list of the job attributes which are set from the user's locale path name. Possible values for the
* elements of this array are:
*
* - {@link #NONE NONE} - No job attributes are used from the locale path name at the time a job is
* started for this user profile.
*
- "*SYSVAL" - The job attributes assigned from the locale path name are determined by the system value
* QSETJOBATR at the time a job is started for this user profile.
*
- "*CCSID" - The coded character set identifier is set from the locale path name at the time a job is
* started for this user profile.
*
- "*DATFMT" - The date format is set from the locale path name at the time a job is started for this
* user profile.
*
- "*DATSEP" - The date separator is set from the locale path name at the time a job is started for this
* user profile.
*
- "*SRTSEQ" - The sort sequence is set from the locale path name at the time a job is started for this
* user profile.
*
- "*TIMSEP" - The time separator is set from the locale path name at the time a job is started for this
* user profile.
*
- "*DECFMT" - The decimal format is set from the locale path name at the time a job is started for this
* user profile.
*
* @see #setLocaleJobAttributes
**/
public String[] getLocaleJobAttributes()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return localeJobAttributes_;
}
private static final String[] LOCALE_ATTRIBUTES = new String[]
{
NONE,
"*SYSVAL",
"*CCSID",
"*DATFMT",
"*DATSEP",
"*SRTSEQ",
"*TIMSEP",
"*DECFMT"
};
/**
* Retrieves the locale path name that is assigned to the user profile when a job is started.
*
* @return The locale path name that is assigned to the user profile when a job is started. Possible values are:
*
* - "*C" - The C locale path name is assigned.
*
- {@link #NONE NONE} - No locale path name is assigned.
*
- "*POSIX" - The POSIX locale path name is assigned.
*
- "*SYSVAL" - The QLOCALE system value is used to determine the locale path name.
*
- A locale path name.
*
* @see #setLocalePathName
**/
public String getLocalePathName()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return localePathName_;
}
/**
* Retrieves the maximum amount of auxiliary storage (in kilobytes) that can be assigned to store permanant objects
* owned by the user.
*
* @return The maximum amount of auxiliary storage (in kilobytes) that can be assigned to store permanant objects
* owned by the user. Possible values are:
*
* - -1 - The user does not have a maximum amount of allowed storage (*NOMAX).
*
- -2 - The maximum amount cannot be represent in an int value.
*
- The maximum amount of auxiliary storage (in kilobytes).
*
* @see #setMaximumStorageAllowed(int)
* @see #setMaximumStorageAllowed(String)
**/
public int getMaximumStorageAllowed()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return maximumStorageAllowed_;
}
public long getMaximumStorageAllowedInLong()//@P1A
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return maximumStorageAllowedInLong_;
}
/**
* Retrieves the fully qualified integrated file system path name of the message queue that is used by this user.
*
* @return The fully qualified integrated file system path name of the message queue that is used by this user.
* @see QSYSObjectPathName
* @see #setMessageQueue
**/
public String getMessageQueue()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return messageQueue_;
}
/**
* Retrieves how the messages are delivered to the message queue used by the user.
*
* @return How the messages are delivered to the message queue used by the user. Possible values are:
*
* - "*BREAK" - The job to which the message queue is assigned is interrupted when a message arrives on
* the message queue.
*
- "*DFT" - Messages requiring replies are answered with their default reply.
*
- "*HOLD" - The messages are held in the message queue until they are requested by the user or program.
*
- "*NOTIFY" - The job to which the message queue is assigned is notified when a message arrives on the
* message queue.
*
* @see #setMessageQueueDeliveryMethod
**/
public String getMessageQueueDeliveryMethod()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return messageQueueDeliveryMethod_;
}
/**
* Retrieves the lowest severity that a message can have and still be delivered to a user in break or notify mode.
*
* @return The lowest severity that a message can have and still be delivered to a user in break or notify mode. The
* severity is a value in the range 0 through 99.
* @see #setMessageQueueSeverity
**/
public int getMessageQueueSeverity()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return messageQueueSeverity_;
}
/**
* Returns the user profile name.
*
* @return The user profile name.
* @see #setName
**/
public String getName()
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Getting name: " + name_);
return name_;
}
/**
* Retrieves the user's object auditing value.
*
* @return The user's object auditing value. Possible values are:
*
* - {@link #NONE NONE} - No additional object auditing is done for the user.
*
- "*CHANGE" - Object changes are audited for the user if the object's auditing value is *USRPRF.
*
- "*ALL" - Object read and change operations are audited for the user if the object's auditing value is
* *USRPRF.
*
* @see #setObjectAuditingValue
**/
public String getObjectAuditingValue()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return objectAuditingValue_;
}
/**
* Return an object representing the objects that this user owns.
*
* @return UserObjectsOwnedList object constructed with default selection criteria.
**/
public UserObjectsOwnedList getObjectsOwned()
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Loading user information.");
if (system_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting system.");
throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
if (name_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting name.");
throw new ExtendedIllegalStateException("name", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
return (new UserObjectsOwnedList(system_, name_));
}
/**
* Retrieves the output queue used by this user.
*
* @return The output queue used by this user. Possible values are:
*
* - "*WRKSTN" - The output queue assigned to the user's work station is used.
*
- "*DEV" - An output queue with the same name as the device specified in the printer device parameter
* is used.
*
- The fully qualified integrated file system path name of the output queue.
*
* @see QSYSObjectPathName
* @see #setOutputQueue
**/
public String getOutputQueue()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return outputQueue_;
}
/**
* Retrieves who is to own objects created by this user.
*
* @return Who is to own objects created by this user. Possible values are:
*
* - "*USRPRF" - The user owns any objects the user creates. If the user does not have a group profile,
* the field contains this value.
*
- "*GRPPRF" - The user's group profile owns any objects the user creates.
*
* @see #setOwner
**/
public String getOwner()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return owner_;
}
/**
* Retrieves the date the user's password expires.
*
* @return The date the user's password expires. Possible values are:
*
* - A date object containing the date the user's password expires.
*
- null - The user's password will not expire (password expiration interval of *NOMAX) or the user's
* password is set to expired.
*
**/
public Date getPasswordExpireDate()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
if (passwordExpireDate_ == null)
{
try
{
// First see if a blank value was returned.
if (isNullOrBlanks(passwordExpireDateBytes_))
return null;
AS400Timestamp conv = getTimestampConverter(FORMAT_DTS); // field is in *DTS format
//
// Note. The conv.toTimestamp method assumes that the reference timezone is GMT. This is then
// adjusted by the conv.toDate() method to get to the right timestamp in the current default
//
passwordExpireDate_ = conv.toDate(conv.toTimestamp(passwordExpireDateBytes_), TimeZone.getDefault());
}
catch (Exception e)
{
if (Trace.traceOn_) Trace.log(Trace.ERROR, "Exception while converting datePasswordExpires:", e);
throw new InternalErrorException(InternalErrorException.UNEXPECTED_EXCEPTION, e);
}
}
return passwordExpireDate_;
}
private static final int FORMAT_DTS = AS400Timestamp.FORMAT_DTS; // *DTS format
private synchronized AS400Timestamp getTimestampConverter(int format)
{
if (timestampConverter_ == null)
{
timestampConverter_ = new AS400Timestamp(AS400.getDefaultTimeZone(system_));
timestampConverter_.setFormat(format);
}
else if (format != timestampConverter_.getFormat())
timestampConverter_.setFormat(format);
return timestampConverter_;
}
/**
* Retrieves the time period during which a password is blocked from being changed following the prior successful
* password change operation.
*
* Note: This method should not be used when running to IBM i 5.4 or earlier releases.
*
* @return The time period during which a password is blocked from being changed. Possible values are:
*
* - "*SYSVAL" - The system value QPWDCHGBLK is used to determine the block password change value.
* - {@link #NONE NONE} - The password can be changed at any time.
* - 1-99 - Indicates the number of hours a user must wait after the prior successful password change
* operation before they are able to change the password again.
*
* @see #setPasswordChangeBlock
*/
public String getPasswordChangeBlock()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return pwdChangeBlock_;
}
/**
* Retrieves the number of days the user's password can remain active before it must be changed.
*
* @return The number of days the user's password can remain active before it must be changed. Possible values are:
*
* - 0 - The system value QPWDEXPITV is used to determine the user's password expiration interval.
*
- -1 - The user's password does not expire (*NOMAX).
*
- 1-366 - The number of days the user's password can remain active before it must be changed.
*
* @see #setPasswordExpirationInterval(int)
* @see #setPasswordExpirationInterval(String)
**/
public int getPasswordExpirationInterval()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return passwordExpirationInterval_;
}
/**
* Retrieves the date the user's password was last changed.
*
* @return The date the user's password was last changed.
**/
public Date getPasswordLastChangedDate()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
if (passwordLastChangedDate_ == null)
{
try
{
// First see if a blank value was returned. If so, return null.
if (isNullOrBlanks(passwordLastChangedDateBytes_)) return null;
AS400Timestamp conv = getTimestampConverter(FORMAT_DTS); // field is in *DTS format
// In this case, the conv.toTimestamp method assumes that the timezone is in GMT. This is then
// adjusted by the conv.toDate() method to get to the right timestamp in the current default
passwordLastChangedDate_ = conv.toDate(conv.toTimestamp(passwordLastChangedDateBytes_), TimeZone.getDefault());
}
catch (Exception e)
{
Trace.log(Trace.ERROR, "Exception while converting passwordLastChangedDate:", e);
throw new InternalErrorException(InternalErrorException.UNEXPECTED_EXCEPTION, e);
}
}
return passwordLastChangedDate_;
}
/**
* Retrieves the date and time the user last signed on.
*
* @return The date and time the user last signed on. Possible values are:
*
* - A date object containing the date and time the user last signed on.
*
- null - The user has never signed on the system.
*
**/
public Date getPreviousSignedOnDate()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return previousSignedOnDate_;
}
/**
* Retrieves the printer used to print for this user.
*
* @return The printer used to print for this user. Possible values are:
*
* - "*WRKSTN" - The printer assigned to the user's work station is used.
*
- "*SYSVAL" - The default system printer specified in the system value QPRTDEV is used.
*
- The print device.
*
* @see #setPrintDevice
**/
public String getPrintDevice()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return printDevice_;
}
/**
* Retrieves the number of sign-on attempts that were not valid since the last successful sign-on.
*
* @return The number of sign-on attempts that were not valid since the last successful sign-on.
**/
public int getSignedOnAttemptsNotValid()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return signedOnAttemptsNotValid_;
}
/**
* Retrieves the name of the sort sequence table used for string comparisons.
*
* @return The name of the sort sequence table used for string comparisons. Possible values are:
*
* - "*HEX" - The hexadecimal values of the characters are used to determine the sort sequence.
*
- "*LANGIDUNQ" - A unique-weight sort table associated with the language specified.
*
- "*LANGIDSHR" - A shared-weight sort table associated with the language specified.
*
- "*SYSVAL" - The system value QSRTSEQ.
*
- The fully qualified integrated file system path name of the sort sequence table name.
*
* @see QSYSObjectPathName
* @see #setSortSequenceTable
**/
public String getSortSequenceTable()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return sortSequenceTable_;
}
/**
* Retrieves a list of the special authorities the user has.
*
* @return A list of the special authorities the user has. If the user has no special authorities, an empty array is
* returned. Possible values for the elements of this array are:
*
* - {@link #SPECIAL_AUTHORITY_ALL_OBJECT SPECIAL_AUTHORITY_ALL_OBJECT} - All object.
*
- {@link #SPECIAL_AUTHORITY_SECURITY_ADMINISTRATOR SPECIAL_AUTHORITY_SECURITY_ADMINISTRATOR} - Security
* administrator.
*
- {@link #SPECIAL_AUTHORITY_JOB_CONTROL SPECIAL_AUTHORITY_JOB_CONTROL} - Job control.
*
- {@link #SPECIAL_AUTHORITY_SPOOL_CONTROL SPECIAL_AUTHORITY_SPOOL_CONTROL} - Spool control.
*
- {@link #SPECIAL_AUTHORITY_SAVE_SYSTEM SPECIAL_AUTHORITY_SAVE_SYSTEM} - Save system.
*
- {@link #SPECIAL_AUTHORITY_SERVICE SPECIAL_AUTHORITY_SERVICE} - Service.
*
- {@link #SPECIAL_AUTHORITY_AUDIT SPECIAL_AUTHORITY_AUDIT} - Audit.
*
- {@link #SPECIAL_AUTHORITY_IO_SYSTEM_CONFIGURATION SPECIAL_AUTHORITY_IO_SYSTEM_CONFIGURATION} -
* Input/output system configuration.
*
* @see #hasSpecialAuthority
* @see #setSpecialAuthority
**/
public String[] getSpecialAuthority()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return specialAuthority_;
}
/**
* Retrieves the special environment the user operates in after signing on.
*
* @return The special environment the user operates in after signing on. Possible values are:
*
* - "*SYSVAL" - The system value QSPCENV is used to determine the user's special environment.
*
- {@link #NONE NONE} - The user operates in the IBM i system environment.
*
- "*S36" - The user operates in the System/36 environment.
*
* @see #setSpecialEnvironment
**/
public String getSpecialEnvironment()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return specialEnvironment_;
}
/**
* Retrieves the status of the user profile.
*
* @return The status of the user profile. Possible values are:
*
* - "*ENABLED" - The user profile is enabled; therefor, the user is able to sign on.
*
- "*DISABLED" - The user profile is not enabled; therefor, the user cannot sign on.
*
* @see #setStatus
**/
public String getStatus()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return status_;
}
/**
* Retrieves the amount of auxiliary storage (in kilobytes) occupied by this user's owned objects.
*
* @return The amount of auxiliary storage (in kilobytes) occupied by this user's owned objects.
**/
public int getStorageUsed()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return storageUsed_;
}
/**
* Retrieves the amount of auxiliary storage (in kilobytes) occupied by this user's owned objects.
*
* @return The amount of auxiliary storage (in kilobytes) occupied by this user's owned objects.
**/
public long getStorageUsedInLong()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return storageUsedInLong_;
}
/**
* Retrieves the supplemental groups for the user profile.
*
* @return The array of supplemental groups for the user profile, or an array of length 0 if there are no
* supplemental groups.
* @see #setSupplementalGroups
**/
public String[] getSupplementalGroups()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return supplementalGroups_;
}
/**
* Retrieves the number of supplemental groups for the user profile.
*
* This method simply returns getSupplementalGroups().length.
*
* @return The number of supplemental groups for the user profile.
* @see #getSupplementalGroups
**/
public int getSupplementalGroupsNumber()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return supplementalGroups_ == null ? 0 : supplementalGroups_.length;
}
/**
* Returns the system object representing the system on which the user profile exists.
*
* @return The system object representing the system on which the user profile exists. If the system has not been
* set, null is returned.
* @see #setSystem
**/
public AS400 getSystem()
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Getting system: " + system_);
return system_;
}
/**
* Returns the amount of time, in minutes, a time-based one-time password (TOTP) is optional on an authentication
* request for the user. This is the amount of time after a valid user ID and password authentication using a TOTP
* value is performed, that subsequent authentications will be allowed without having to specifying a new TOTP value.
* When this value is zero, a TOTP is required for every authentication for the user if the user has *TOTP as an
* authentication method.
*
* @return the TOTP optional interval
*/
public int getTOTPOptionalInterval()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return totpOptionalInterval_;
}
/**
* Returns the The number of minutes remaining in the TOTP optional interval in which an authentication without
* specifying a new TOTP value is valid. When this value is zero, subsequent authentications will require a valid TOTP
* value be specified.
*
* @return the TOTP optional interval remaining
*/
public int getTOTPOptionalIntervalRemaining()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return totpOptionalIntervalRemaining_;
}
/**
* Returns whether the user has a TOTP key specified. This key is only used when the additional authentication methods include *TOTP.
*
* @return true if TOTP key exists; otherwise, false.
*/
public boolean getTOTPKeyExistsIndicator()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return totpKeyExistsIndicator_;
}
/**
* Returns the date and time the TOTP key was last changed using the Change TOTP Key (CHGTOTPKEY) command.
*
* @return the TOTP key last changed date, or null if unable to retrieve value.
*/
public Date getTOTPKeyLastChangedDate()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return totpKeyLastChangedDate_;
}
/**
* Retrieves a list of action audit levels for the user.
*
* @return A list of action audit levels for the user. Possible values for the elements of this array are:
*
* - "*CMD" - The user has the *CMD audit value specified in the user profile.
*
- "*CREATE" - The user has the *CREATE audit value specified in the user profile.
*
- "*DELETE" - The user has the *DELETE audit value specified in the user profile.
*
- "*JOBDTA" - The user has the *JOBDTA audit value specified in the user profile.
*
- "*OBJMGT" - The user has the *OBJMGT audit value specified in the user profile.
*
- "*OFCSRV" - The user has the *OFCSRV audit value specified in the user profile.
*
- "*OPTICAL" - The user has the *OPTICAL audit value specified in the user profile.
*
- "*PGMADP" - The user has the *PGMADP audit value specified in the user profile.
*
- "*SAVRST" - The user has the *SAVRST audit value specified in the user profile.
*
- "*SECURITY" - The user has the *SECURITY audit value specified in the user profile.
*
- "*SERVICE" - The user has the *SERVICE audit value specified in the user profile.
*
- "*SPLFDTA" - The user has the *SPLFDTA audit value specified in the user profile.
*
- "*SYSMGT" - The user has the *SYSMGT audit value specified in the user profile.
*
* @see #setUserActionAuditLevel
**/
public String[] getUserActionAuditLevel()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return userActionAuditLevel_;
}
private static final String[] AUDIT_LEVELS = new String[]
{
"*CMD",
"*CREATE",
"*DELETE",
"*JOBDTA",
"*OBJMGT",
"*OFCSRV",
"*PGMADP",
"*SAVRST",
"*SECURITY",
"*SERVICE",
"*SPLFDTA",
"*SYSMGT",
"*OPTICAL", // The API shows optical in the middle of the list, but observed behavior is otherwise (at least on V4R3).
"*AUTFAIL",
"*JOBBAS",
"*JOBCHGUSR",
"*NETBAS",
"*NETCLU",
"*NETCMN",
"*NETFAIL",
"*NETSCK",
"*PGMFAIL",
"*PRTDTA",
"*SECCFG",
"*SECDIRSRV",
"*SECIPC",
"*SECNAS",
"*SECRUN",
"*SECSCKD",
"*SECVFY",
"*SECVLDL",
"*NETSECURE",
"*NETUDP"
};
/**
* Retrieves the user class name.
*
* @return The user class name. Possible values are:
*
* - "*SECOFR" - The user has a class of security officer.
*
- "*SECADM" - The user has a class of security administrator.
*
- "*PGMR" - The user has a class of programmer.
*
- "*SYSOPR" - The user has a class of system operator.
*
- "*USER" - The user has a class of end user.
*
* @see #setUserClassName
**/
public String getUserClassName()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return userClassName_;
}
/**
* Retrieves the action that will occur when the user profile has expired.
*
* Note: This method should not be used when running to IBM i 6.1 or earlier releases.
*
* @return The action that will occur when the user profile has expired. Possible values include:
*
* - {@link #NONE NONE} - The user profile will not expire.
*
- "*DISABLE" - The user profile will be disabled.
*
- "*DELETE" - The user profile will be deleted. If the user profile cannot be deleted, it will be
* disabled.
*
**/
public String getUserExpirationAction()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return userExpirationAction_;
}
/**
* Retrieves the date when the user profile expires and is automatically disabled.
*
* Note: This method should not be used when running to IBM i 6.1 or earlier releases.
*
* @return The date when the user profile expires. null is returned if the user profile does not have an
* expiration date.
* @see #setUserExpirationDate
**/
public Date getUserExpirationDate()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
if (userExpirationDate_ == null)
{
try
{
// First see if a blank value was returned. If so, return null.
if (isNullOrBlanks(userExpirationDateBytes_))
return null;
AS400Timestamp conv = getTimestampConverter(FORMAT_DTS); // field is in *DTS format
// Note. The conv.toTimestamp method assumes that the reference timezone is GMT
// In this case, the conv.toTimestamp method assumes that the timezone is in GMT. This is then
// adjusted by the conv.toDate() method to get to the right timestamp in the current default
userExpirationDate_ = conv.toDate(conv.toTimestamp(userExpirationDateBytes_), TimeZone.getDefault());
}
catch (Exception e)
{
if (Trace.traceOn_) Trace.log(Trace.ERROR, "Exception while converting userExpirationDate:", e);
throw new InternalErrorException(InternalErrorException.UNEXPECTED_EXCEPTION, e);
}
}
return userExpirationDate_;
}
// Returns true if the specified byte array is either null or a sequence of EBCDIC blanks (x40). Returns false if
// any character other than EBCDIC blank is encountered.
private static final boolean isNullOrBlanks(byte[] bytes)
{
if (bytes != null)
{
for (int i = 0; i < bytes.length; i++)
{
if (bytes[i] != (byte) 0x40)
return false;
}
}
return true;
}
/**
* Retrieves the number of days before the user profile is automatically disabled.
*
* Note: This method should not be used when running to IBM i 6.1 or earlier releases.
*
* @return The number of days until the user profile expires, starting from when the profile was created or last
* re-enabled. 0 is returned if the user profile does not have a user expiration interval.
* @see #setUserExpirationInterval
**/
public int getUserExpirationInterval()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return userExpirationInterval_;
}
/**
* Retrieves the user ID (UID) number for the user profile. The UID is used to identify the user when using the
* integrated file system.
*
* @return The user ID (UID) number for the user profile.
* @see #setUserID
**/
public long getUserID()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return userID_;
}
/**
* Retrieves the user ID (UID) number for the user profile. The UID is used to identify the user when using the
* integrated file system.
*
* @return The user ID (UID) number for the user profile.
* @deprecated This method has been replaced by {@link #getUserID getUserID()} which returns a long.
**/
@Deprecated
public int getUserIDNumber()
{
return (int)getUserID();
}
/**
* Retrieves a list of options for users to customize their environment.
*
* @return The list of options for users to customize their environment. Possible values include:
*
* - "*CLKWD" - The keywords are shown when a CL command is displayed.
*
- "*EXPERT" - More detailed information is shown when the user is defining or changing the system using
* edit or display object authority. This is independent of the ASTLVL parameter that is available on the
* user profile and other commands.
*
- "*HLPFULL" - UIM online help is to be displayed full screen instead of in a window.
*
- "*STSMSG" - Status messages sent to the user are shown.
*
- "*NOSTSMSG" - Status messages sent to the user are not shown.
*
- "*ROLLKEY" - The opposite action from the system default for roll keys is taken.
*
- "*PRTMSG" - A message is sent to the user when a spooled file is printed.
*
* @see #setUserOptions
**/
public String[] getUserOptions()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return userOptions_;
}
private static final String[] USER_OPTIONS = new String[]
{
"*CLKWD",
"*EXPERT",
"*HLPFULL",
"*STSMSG",
"*NOSTSMSG",
"*ROLLKEY",
"*PRTMSG"
};
/**
* Retrieves the name of the user profile for which the information is returned. Note this is the name that is
* returned by the system, not the name that was set into this User object by the constructor or by a call to
* setUser().
*
* @return The name of the user profile for which the information is returned.
**/
public String getUserProfileName()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return userProfileName_;
}
public boolean isAuthCollectionActive()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return authCollectionActive_;
}
public boolean isAuthCollectionRepositoryExist()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return authCollectionRepositoryExist_;
}
public boolean isAuthCollectionDeleted()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return authCollectionDeleted_;
}
public String getDetailInSTRAUTCOL()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return detailInSTRAUTCOL_;
}
public String[] getLibNameInSTRAUTCOL()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return libNamesInSTRAUTCOL_;
}
public String[] getObjectNamesInSTRAUTCOL()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return objectNamesInSTRAUTCOL_;
}
public String[] getObjectTypesInSTRAUTCOL()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return objectTypesInSTRAUTCOL_;
}
public String[] getDLOObjectTypesInSTRAUTCOL()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return DLOObjectTypesInSTRAUTCOL_;
}
public String[] getFileSystemObjectTypesInSTRAUTCOL()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return fileSystemObjectTypesInSTRAUTCOL_;
}
public String[] getOmitLibNamesInSTRAUTCOL()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return omitLibNamesInSTRAUTCOL_;
}
/**
* Retrieves if this user profile has been granted the specified authority, or belongs to a group profile that has
* been granted the specified authority.
*
* @param authority The authority to check. It must be one of the following special authority values:
*
* - *ALLOBJ - All object.
*
- *SECADM - Security administrator.
*
- *JOBCTL - Job control.
*
- *SPLCTL - Spool control.
*
- *SAVSYS - Save system.
*
- *SERVICE - Service.
*
- *AUDIT - Audit.
*
- *IOSYSCFG - Input/output system configuration.
*
* @return true if this user has the authority or belongs to a group that has the authority; false if it does not
* have authority or an error occurs.
* @see #getSpecialAuthority
* @see #setSpecialAuthority
**/
public boolean hasSpecialAuthority(String authority)
{
if (authority == null)
{
Trace.log(Trace.ERROR, "Parameter 'authority' is null.");
throw new NullPointerException("authority");
}
// Check to see if this user is authorized.
String[] specialAuthorities = getSpecialAuthority();
if (specialAuthorities != null)
{
for (int i = 0; i < specialAuthorities.length; ++i)
{
if (specialAuthorities[i].equals(authority))
return true;
}
}
// Check to see if a group this user belongs to is authorized.
String primaryGroup = getGroupProfileName();
if (primaryGroup != null && !primaryGroup.equals(NONE))
{
try
{
User group = new User(system_, primaryGroup);
if (group.hasSpecialAuthority(authority))
return true;
}
catch (Exception e)
{
Trace.log(Trace.ERROR, "Unexpected Exception constructing User object:", e);
throw new InternalErrorException(InternalErrorException.UNEXPECTED_EXCEPTION, e);
}
}
// Check the supplemental groups.
String[] supplementalGroups = getSupplementalGroups();
if (supplementalGroups != null)
{
for (int i = 0; i < supplementalGroups.length; ++i)
{
try
{
User group = new User(system_, supplementalGroups[i]);
if (group.hasSpecialAuthority(authority))
return true;
}
catch (Exception e)
{
Trace.log(Trace.ERROR, "Unexpected Exception constructing User object:", e);
throw new InternalErrorException(InternalErrorException.UNEXPECTED_EXCEPTION, e);
}
}
}
// Not authorized.
return false;
}
/**
* Retrieves whether this user is a group that has members.
*
* For User objects, this should always return false. For UserGroup objects, this should return true if the group
* profile has members.
*
* @return true if the user is a group that has members, false otherwise.
* @see UserGroup
**/
public boolean isGroupHasMember()
{
if (!loaded_ && !partiallyLoaded_) loadUserInformation_SwallowExceptions();
return groupHasMember_;
}
/**
* Retrieves whether the password is managed locally.
*
* @return true if the password is managed locally, false otherwise.
* @see #setLocalPasswordManagement
**/
public boolean isLocalPasswordManagement()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return localPasswordManagement_;
}
/**
* Retrieves whether *NONE is specified for the password in the user profile.
*
* @return true if *NONE is specified for the password in the user profile, false otherwise.
**/
public boolean isNoPassword()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return noPassword_;
}
/**
* Retrieves whether the user's password is set to expired, requiring the user to change the password when signing
* on.
*
* @return true if the password is set to expired, false otherwise.
* @see #setPasswordSetExpire
**/
public boolean isPasswordSetExpire()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return passwordSetExpire_;
}
/**
* Retrieves whether a user entitlement is required for this user profile. This property should be ignored on
* systems that do not have feature 5052 installed. Note: This method is valid only when running to IBM i 6.1 or
* higher.
*
* @return true if a user entitlement is required for this user profile; false otherwise.
**/
public boolean isUserEntitlementRequired()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return userEntitlementRequired_;
}
/**
* Retrieves whether there are digital certificates associated with this user.
*
* @return true if there are digital certificates associated with this user; false otherwise.
**/
public boolean isWithDigitalCertificates()
{
if (!loaded_) loadUserInformation_SwallowExceptions();
return withDigitalCertificates_;
}
// Helper method... calls loadUserInformation and swallows all exceptions so that all of the getters can call it.
private void loadUserInformation_SwallowExceptions()
{
try {
loadUserInformation();
} catch (Exception e) {
Trace.log(Trace.ERROR, "Exception swallowed during retrieval of user information:", e);
}
}
/**
* Refreshes the values for all attributes.
* Same as {@link #refresh refresh()}.
*
* @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 loadUserInformation() throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Loading user information.");
if (system_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting system.");
throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
if (name_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting name.");
throw new ExtendedIllegalStateException("name", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
Converter conv = new Converter(system_.getCcsid(), system_);
byte[] userProfileName = new byte[] { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 };
conv.stringToByteArray(name_, userProfileName);
int receiverVariableLength = 1024;
ProgramParameter[] parameters = new ProgramParameter[]
{
// Receiver variable, output, char(*).
new ProgramParameter(receiverVariableLength),
// Receiver variable length, input, binary(4).
new ProgramParameter(BinaryConverter.intToByteArray(receiverVariableLength)),
// Format name, input, char(8), EBCDIC 'USRI0300'.
new ProgramParameter(new byte[] { (byte)0xE4, (byte)0xE2, (byte)0xD9, (byte)0xC9, (byte)0xF0, (byte)0xF3, (byte)0xF0, (byte)0xF0 } ),
// User profile name, input, char(10).
new ProgramParameter(userProfileName),
// Error code, I/O, char(*).
ERROR_CODE
};
ProgramCall pc = new ProgramCall(system_, "/QSYS.LIB/QSYRUSRI.PGM", parameters);
// Note: QSYRUSRI is designated "Threadsafe: Yes".
// But honor the ProgramCall.threadsafe property if set.
pc.suggestThreadsafe();
if (!pc.run())
throw new AS400Exception(pc.getMessageList());
byte[] data = parameters[0].getOutputData();
int bytesReturned = BinaryConverter.byteArrayToInt(data, 0);
int bytesAvailable = BinaryConverter.byteArrayToInt(data, 4);
if (bytesReturned < bytesAvailable)
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Retrieve user information receiver variable too small, bytes returned: " + bytesReturned + ", bytes available: " + bytesAvailable);
receiverVariableLength = bytesAvailable;
try
{
parameters[0].setOutputDataLength(receiverVariableLength);
parameters[1].setInputData(BinaryConverter.intToByteArray(receiverVariableLength));
}
catch (PropertyVetoException e)
{
Trace.log(Trace.ERROR, "Unexpected PropertyVetoException:", e);
throw new InternalErrorException(InternalErrorException.UNEXPECTED_EXCEPTION, e);
}
if (!pc.run())
throw new AS400Exception(pc.getMessageList());
data = parameters[0].getOutputData();
}
userProfileName_ = conv.byteArrayToString(data, 8, 10).trim();
// Previous sign-on is in format: "CYYMMDDHHMMSS".
String previousSignon = conv.byteArrayToString(data, 18, 13); // Note: This time value is relative to the system's local time zone, not UTC.
if (previousSignon.trim().length() > 0)
{
Calendar cal = AS400Calendar.getGregorianInstance();
cal.clear();
cal.set(Calendar.YEAR, 1900 + Integer.parseInt(previousSignon.substring(0, 3)));
cal.set(Calendar.MONTH, Integer.parseInt(previousSignon.substring(3, 5)) - 1);
cal.set(Calendar.DATE, Integer.parseInt(previousSignon.substring(5, 7)));
cal.set(Calendar.HOUR, Integer.parseInt(previousSignon.substring(7, 9)));
cal.set(Calendar.MINUTE, Integer.parseInt(previousSignon.substring(9, 11)));
cal.set(Calendar.SECOND, Integer.parseInt(previousSignon.substring(11, 13)));
// Set the correct time zone (in case client is in a different zone than server).
cal.setTimeZone(system_.getTimeZone());
previousSignedOnDate_ = cal.getTime();
}
else
previousSignedOnDate_ = null;
signedOnAttemptsNotValid_ = BinaryConverter.byteArrayToInt(data, 32);
status_ = conv.byteArrayToString(data, 36, 10).trim();
if (passwordLastChangedDateBytes_ == null) passwordLastChangedDateBytes_ = new byte[8];
// *DTS format - convert on getter.
System.arraycopy(data, 46, passwordLastChangedDateBytes_, 0, 8);
passwordLastChangedDate_ = null; // Reset.
// EBCDIC 'Y' for no password.
noPassword_ = (data[54] == (byte)0xE8);
// 1-366. 0 means use system value QPWDEXPITV. -1 means *NOMAX.
passwordExpirationInterval_ = BinaryConverter.byteArrayToInt(data, 56);
if (passwordExpireDateBytes_ == null) passwordExpireDateBytes_ = new byte[8];
// *DTS format.
System.arraycopy(data, 60, passwordExpireDateBytes_, 0, 8);
passwordExpireDate_ = null; // Reset.
daysUntilPasswordExpire_ = BinaryConverter.byteArrayToInt(data, 68);
// EBCDIC 'Y' if the user's password is set to expired.
passwordSetExpire_ = (data[72] == (byte)0xE8);
userClassName_ = conv.byteArrayToString(data, 73, 10).trim();
int numSpecAuth = 0;
for (int i = 0; i < 8; ++i)
{
if (data[83 + i] == (byte)0xE8) // EBCDIC 'Y' is 0xE8.
++numSpecAuth;
}
specialAuthority_ = new String[numSpecAuth];
int counter = 0;
for (int i = 0; i < 8; ++i)
{
if (data[83 + i] == (byte)0xE8) // EBCDIC 'Y' is 0xE8.
specialAuthority_[counter++] = SPECIAL_AUTHORITIES[i];
}
groupProfileName_ = conv.byteArrayToString(data, 98, 10).trim();
owner_ = conv.byteArrayToString(data, 108, 10).trim();
groupAuthority_ = conv.byteArrayToString(data, 118, 10).trim();
assistanceLevel_ = conv.byteArrayToString(data, 128, 10).trim();
currentLibraryName_ = conv.byteArrayToString(data, 138, 10).trim();
String menu = conv.byteArrayToString(data, 148, 10).trim();
initialMenu_ = menu.equals("*SIGNOFF") ? menu : QSYSObjectPathName.toPath(conv.byteArrayToString(data, 158, 10).trim(), menu, "MNU");
String prog = conv.byteArrayToString(data, 168, 10).trim();
initialProgram_ = prog.equals(NONE) ? NONE : QSYSObjectPathName.toPath(conv.byteArrayToString(data, 178, 10).trim(), prog, "PGM");
limitCapabilities_ = conv.byteArrayToString(data, 188, 10).trim();
description_ = conv.byteArrayToString(data, 198, 50).trim();
displaySignOnInformation_ = conv.byteArrayToString(data, 248, 10).trim();
limitDeviceSessions_ = conv.byteArrayToString(data, 258, 10).trim();
keyboardBuffering_ = conv.byteArrayToString(data, 268, 10).trim();
maximumStorageAllowed_ = BinaryConverter.byteArrayToInt(data, 280);
storageUsed_ = BinaryConverter.byteArrayToInt(data, 284);
highestSchedulingPriority_ = data[288] & 0x0000000F;
jobDescription_ = QSYSObjectPathName.toPath(conv.byteArrayToString(data, 299, 10).trim(), conv.byteArrayToString(data, 289, 10).trim(), "JOBD");
accountingCode_ = conv.byteArrayToString(data, 309, 15).trim();
messageQueue_ = QSYSObjectPathName.toPath(conv.byteArrayToString(data, 334, 10).trim(), conv.byteArrayToString(data, 324, 10).trim(), "MSGQ");
messageQueueDeliveryMethod_ = conv.byteArrayToString(data, 344, 10).trim();
messageQueueSeverity_ = BinaryConverter.byteArrayToInt(data, 356);
String outQueueName = conv.byteArrayToString(data, 360, 10).trim();
outputQueue_ = outQueueName.equals("*WRKSTN") || outQueueName.equals("*DEV") ? outQueueName : QSYSObjectPathName.toPath(conv.byteArrayToString(data, 370, 10).trim(), outQueueName, "OUTQ");
printDevice_ = conv.byteArrayToString(data, 380, 10).trim();
specialEnvironment_ = conv.byteArrayToString(data, 390, 10).trim();
String keyName = conv.byteArrayToString(data, 400, 10).trim();
attentionKeyHandlingProgram_ = keyName.equals(NONE) || keyName.equals("*SYSVAL") ? keyName : QSYSObjectPathName.toPath(conv.byteArrayToString(data, 410, 10).trim(), keyName, "PGM");
languageID_ = conv.byteArrayToString(data, 420, 10).trim();
countryID_ = conv.byteArrayToString(data, 430, 10).trim();
ccsid_ = BinaryConverter.byteArrayToInt(data, 440);
int numUserOptions = 0;
for (int i = 0; i < 7; ++i)
{
if (data[444 + i] == (byte)0xE8) // EBCDIC 'Y' is 0xE8.
++numUserOptions;
}
userOptions_ = new String[numUserOptions];
counter = 0;
for (int i = 0; i < 7; ++i)
{
if (data[444 + i] == (byte)0xE8) // EBCDIC 'Y' is 0xE8.
userOptions_[counter++] = USER_OPTIONS[i];
}
String sortName = conv.byteArrayToString(data, 480, 10).trim();
sortSequenceTable_ = sortName.equals("*HEX") || sortName.equals("*LANGIDUNQ") || sortName.equals("*LANGIDSHR") || sortName.equals("*SYSVAL") || sortName.length() == 0 ? sortName : QSYSObjectPathName.toPath(conv.byteArrayToString(data, 490, 10).trim(), sortName, "FILE");
objectAuditingValue_ = conv.byteArrayToString(data, 500, 10).trim();
int numAudLevel = 0;
for (int i = 0; i < 33; ++i)//
{
if (data[510 + i] == (byte)0xE8) // EBCDIC 'Y' is 0xE8.
++numAudLevel;
}
userActionAuditLevel_ = new String[numAudLevel];
counter = 0;
for (int i = 0; i < 33; ++i)
{
if (data[510 + i] == (byte)0xE8) // EBCDIC 'Y' is 0xE8.
userActionAuditLevel_[counter++] = AUDIT_LEVELS[i];
}
groupAuthorityType_ = conv.byteArrayToString(data, 574, 10).trim();
int supplementalGroupOffset = BinaryConverter.byteArrayToInt(data, 584);
int supplementalGroupCount = BinaryConverter.byteArrayToInt(data, 588);
supplementalGroups_ = new String[supplementalGroupCount];
for (int i = 0; i < supplementalGroupCount; ++i)
{
supplementalGroups_[i] = conv.byteArrayToString(data, supplementalGroupOffset + i * 10, 10).trim();
}
userID_ = BinaryConverter.byteArrayToUnsignedInt(data, 592);
groupID_ = BinaryConverter.byteArrayToUnsignedInt(data, 596);
int homeDirOffset = BinaryConverter.byteArrayToInt(data, 600);
int homeDirCcsid = BinaryConverter.byteArrayToInt(data, homeDirOffset);
int homeDirLength = BinaryConverter.byteArrayToInt(data, homeDirOffset + 16);
Converter homeDirConv = homeDirCcsid > 0 && homeDirCcsid < 65535 ? new Converter(homeDirCcsid, system_) : conv;
homeDirectory_ = homeDirConv.byteArrayToString(data, homeDirOffset + 32, homeDirLength).trim();
int numLocaleJobAttribs = 0;
for (int i = 0; i < 8; ++i)
{
if (data[608 + i] == (byte)0xE8) // EBCDIC 'Y' is 0xE8.
++numLocaleJobAttribs;
}
localeJobAttributes_ = new String[numLocaleJobAttribs];
counter = 0;
for (int i = 0; i < 8; ++i)
{
if (data[608 + i] == (byte)0xE8) // EBCDIC 'Y' is 0xE8.
localeJobAttributes_[counter++] = LOCALE_ATTRIBUTES[i];
}
int localePathOffset = BinaryConverter.byteArrayToInt(data, 624);
int localePathLength = BinaryConverter.byteArrayToInt(data, 628);
if (localePathLength == 10)
localePathName_ = conv.byteArrayToString(data, localePathOffset, localePathLength).trim();
else
{
int localePathCcsid = BinaryConverter.byteArrayToInt(data, localePathOffset);
localePathLength = BinaryConverter.byteArrayToInt(data, localePathOffset + 16);
Converter localePathConv = localePathCcsid > 0 && localePathCcsid < 65535 ? new Converter(localePathCcsid, system_) : conv;
localePathName_ = localePathConv.byteArrayToString(data, localePathOffset + 32, localePathLength).trim();
}
// EBCDIC '1' indicates the user is a group that has members.
groupHasMember_ = (data[632] == (byte)0xF1);
// EBCDIC '1' indicates there is at least one digital certificate associated with this user.
withDigitalCertificates_ = (data[633] == (byte)0xF1);
chridControl_ = conv.byteArrayToString(data, 634, 10).trim();
int vrm = system_.getVRM();
if (vrm >= 0x00050100)
{
int iaspOffset = BinaryConverter.byteArrayToInt(data, 644);
int iaspCount = BinaryConverter.byteArrayToInt(data, 648);
int iaspCountReturned = BinaryConverter.byteArrayToInt(data, 652);
int iaspLength = BinaryConverter.byteArrayToInt(data, 656);
if (Trace.traceOn_ && iaspCount != iaspCountReturned)
{
Trace.log(Trace.WARNING, "Not all IASP information was returned, count: " + iaspCount + ", returned:", iaspCountReturned);
}
iaspNames_ = new String[iaspCountReturned];
iaspStorageAllowed_ = new int[iaspCountReturned];
iaspStorageUsed_ = new int[iaspCountReturned];
for (int i = 0; i < iaspCountReturned; ++i)
{
int offset = iaspOffset + (i * iaspLength);
iaspNames_[i] = conv.byteArrayToString(data, offset, 10).trim();
iaspStorageAllowed_[i] = BinaryConverter.byteArrayToInt(data, offset + 12);
iaspStorageUsed_[i] = BinaryConverter.byteArrayToInt(data, offset + 16);
}
if (vrm >= 0x00050300)
{
// EBCDIC 'Y' indicates the password is managed locally.
localPasswordManagement_ = (data[660] == (byte)0xE8);
if (vrm >= 0x00060100)// @550 added password change block
{
pwdChangeBlock_ = conv.byteArrayToString(data, 661, 10).trim();
// EBCDIC '1' indicates user entitlement is required.
userEntitlementRequired_ = (data[671] == (byte) 0xF1);
if (vrm >= 0x00070100)
{
userExpirationInterval_ = BinaryConverter.byteArrayToInt(data, 672);
if (userExpirationDateBytes_ == null) userExpirationDateBytes_ = new byte[8];
// *DTS format - convert on getter.
System.arraycopy(data, 676, userExpirationDateBytes_, 0, 8);
userExpirationDate_ = null; // Reset.
userExpirationAction_ = conv.byteArrayToString(data, 684, 10).trim();
if (vrm >= 0x00070200)
{
maximumStorageAllowedInLong_ = BinaryConverter.byteArrayToUnsignedInt(data, 696);
storageUsedInLong_= BinaryConverter.byteArrayToUnsignedInt(data, 704);
if (vrm >= 0x00070300)
{
int STRAUTCOLOffset = BinaryConverter.byteArrayToInt(data, 712);
// EBCDIC '1' indicates Authority collection is active for this user.
authCollectionActive_ = (data[720] == (byte)0xF1);
// EBCDIC '1' indicates Authority collection repository exists for this user.
authCollectionRepositoryExist_= (data[721] == (byte)0xF1);
if(STRAUTCOLOffset>0)
{
int libNamesOffset = STRAUTCOLOffset+ BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset);
int libNamesNumber = BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+4);
int objectNamesOffset = STRAUTCOLOffset+BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+8);
int objectNamesNumber = BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+12);
int objectTypesOffset = STRAUTCOLOffset+BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+16);
int objectTypesNumber = BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+20);
int DLOObjectTypesOffset = STRAUTCOLOffset+BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+24);
int DLOObjectTypesNumber = BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+28);
int fileSystemObjectTypesOffset = STRAUTCOLOffset+BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+32);
int fileSystemObjectTypesNumber = BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+36);
int omitLibNamesOffset = STRAUTCOLOffset+BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+40);
int omitLibNamesNumber = BinaryConverter.byteArrayToInt(data, STRAUTCOLOffset+44);
authCollectionDeleted_ = "*YES".equalsIgnoreCase(conv.byteArrayToString(data, STRAUTCOLOffset+48, 4).trim())? true:false;
detailInSTRAUTCOL_ = conv.byteArrayToString(data, STRAUTCOLOffset+52, 10).trim();
libNamesInSTRAUTCOL_ = new String[libNamesNumber];
for (int i = 0; i < libNamesNumber; ++i) {
libNamesInSTRAUTCOL_[i] = conv.byteArrayToString(data, libNamesOffset + i * 20, 20).trim();
}
objectNamesInSTRAUTCOL_ = new String[objectNamesNumber];
for (int i = 0; i < objectNamesNumber; ++i) {
objectNamesInSTRAUTCOL_[i] = conv.byteArrayToString(data, objectNamesOffset + i * 10, 10).trim();
}
objectTypesInSTRAUTCOL_ = new String[objectTypesNumber];
for (int i = 0; i < objectTypesNumber; ++i) {
objectTypesInSTRAUTCOL_[i] = conv.byteArrayToString(data, objectTypesOffset + i * 10, 10).trim();
}
DLOObjectTypesInSTRAUTCOL_ = new String[DLOObjectTypesNumber];
for (int i = 0; i < DLOObjectTypesNumber; ++i) {
DLOObjectTypesInSTRAUTCOL_[i] = conv.byteArrayToString(data, DLOObjectTypesOffset + i * 10, 10).trim();
}
fileSystemObjectTypesInSTRAUTCOL_ = new String[fileSystemObjectTypesNumber];
for (int i = 0; i < fileSystemObjectTypesNumber; ++i) {
fileSystemObjectTypesInSTRAUTCOL_[i] = conv.byteArrayToString(data, fileSystemObjectTypesOffset + i * 10, 10).trim();
}
omitLibNamesInSTRAUTCOL_ = new String[omitLibNamesNumber];
for (int i = 0; i < omitLibNamesNumber; ++i) {
omitLibNamesInSTRAUTCOL_[i] = conv.byteArrayToString(data, omitLibNamesOffset + i * 20, 20).trim();
}
}
if (vrm > 0x00070500)
{
boolean totpB = (data[812] == (byte)0xE8);
boolean regfac = (data[813] == (byte)0xE8);
String[] authMethods = new String[(totpB && regfac) ? 2 : 1];
if (totpB || regfac)
{
int idx=0;
if (totpB)
authMethods[idx++] = AUTHENTICATION_METHOD_TOTP;
if (regfac)
authMethods[idx++] = AUTHENTICATION_METHOD_REGFAC;
}
else
authMethods[0] = NONE;
authenticationMethods_ = authMethods;
totpOptionalInterval_ = BinaryConverter.byteArrayToInt(data, 824);
totpOptionalIntervalRemaining_ = BinaryConverter.byteArrayToInt(data, 828);
totpKeyExistsIndicator_ = (data[832] == (byte)0xF1) ? true : false;
String totpKeyLastChangedDate = conv.byteArrayToString(data, 833, 13); // Note: This time value is relative to the system's local time zone, not UTC.
if (totpKeyLastChangedDate.trim().length() > 0)
{
Calendar cal = AS400Calendar.getGregorianInstance();
cal.clear();
cal.set(Calendar.YEAR, 1900 + Integer.parseInt(totpKeyLastChangedDate.substring(0, 3)));
cal.set(Calendar.MONTH, Integer.parseInt(totpKeyLastChangedDate.substring(3, 5)) - 1);
cal.set(Calendar.DATE, Integer.parseInt(totpKeyLastChangedDate.substring(5, 7)));
cal.set(Calendar.HOUR, Integer.parseInt(totpKeyLastChangedDate.substring(7, 9)));
cal.set(Calendar.MINUTE, Integer.parseInt(totpKeyLastChangedDate.substring(9, 11)));
cal.set(Calendar.SECOND, Integer.parseInt(totpKeyLastChangedDate.substring(11, 13)));
// Set the correct time zone (in case client is in a different zone than server).
cal.setTimeZone(system_.getTimeZone());
totpKeyLastChangedDate_ = cal.getTime();
}
else
totpKeyLastChangedDate_ = null;
} // vrm > 0x00070500
} // vrm >= 0x00070300
} // vrm >= 0x00070200
} // vrm >= 0x00070100
} // vrm >= 0x00060100
} // vrm >= 0x00050300
} // vrm >= 0x00050100
loaded_ = true;
connected_ = true;
}
/**
* Refreshes all the attribute values for this User object by retrieving them from the system.
* Same as {@link #loadUserInformation loadUserInformation()}.
*
* @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 refresh()
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
loadUserInformation();
}
/**
* Removes the PropertyChangeListener. If the PropertyChangeListener is not on the list, nothing is done.
*
* @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);
}
/**
* Removes the VetoableChangeListener. If the VetoableChangeListener is not on the list, nothing is done.
*
* @param listener The listener object.
**/
public void removeVetoableChangeListener(VetoableChangeListener listener)
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Removing vetoable change listener.");
if (listener == null)
{
Trace.log(Trace.ERROR, "Parameter 'listener' is null.");
throw new NullPointerException("listener");
}
// If we have listeners.
if (vetoableChangeListeners_ != null)
vetoableChangeListeners_.removeVetoableChangeListener(listener);
}
// Used by the setters to change the user profile.
private void runCommand(String parameters) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Changing user profile.");
if (system_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting system.");
throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
if (name_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting name.");
throw new ExtendedIllegalStateException("name", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
CommandCall cmd = getCommandCallObject(COMMAND_CHGUSRPRF);
try {
cmd.setCommand("QSYS/CHGUSRPRF USRPRF(" + name_ + ") " + parameters);
}
catch (PropertyVetoException e) {
} // will never happen
if (!cmd.run())
throw new AS400Exception(cmd.getMessageList());
loaded_ = false;
connected_ = true;
}
// Utility method.
private final CommandCall getCommandCallObject(boolean isChgUsrPrf)
{
if (isChgUsrPrf)
{
if (chgUsrPrf_ == null)
{
chgUsrPrf_ = new CommandCall(system_);
// CHGUSRPRF is not threadsafe, but honor the property if set.
chgUsrPrf_.suggestThreadsafe(false);
}
return chgUsrPrf_;
}
if (chgUsrAud_ == null)
{
chgUsrAud_ = new CommandCall(system_);
// CHGUSRAUD is not threadsafe, but honor the property if set.
chgUsrAud_.suggestThreadsafe(false);
}
return chgUsrAud_;
}
// Used by the setters to change the user auditing.
private void runCommandAud(String parameters) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Changing user auditing.");
if (system_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting system.");
throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
if (name_ == null)
{
Trace.log(Trace.ERROR, "Cannot connect to server before setting name.");
throw new ExtendedIllegalStateException("name", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
CommandCall cmd = getCommandCallObject(COMMAND_CHGUSRAUD);
try {
cmd.setCommand("QSYS/CHGUSRAUD USRPRF(" + name_ + ") " + parameters);
}
catch (PropertyVetoException e) {} // will never happen
if (!cmd.run())
throw new AS400Exception(cmd.getMessageList());
loaded_ = false;
connected_ = true;
}
/**
* Sets the accounting code that is associated with this user profile.
*
* @param accountingCode The accounting code that is associated with this user profile. Possible values are:
*
* - "*BLANK" - An accounting code of 15 blanks is assigned to this user profile.
*
- An accounting code - A 15 character accounting code to be used by jobs that get their
* accounting code from this user profile. If less than 15 characters are specified, the
* string is padded on the right with blanks.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getAccountingCode
**/
public void setAccountingCode(String accountingCode) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (accountingCode == null)
{
Trace.log(Trace.ERROR, "Parameter 'accountingCode' is null.");
throw new NullPointerException("accountingCode");
}
if (accountingCode.equals("*BLANK"))
runCommand("ACGCDE(*BLANK)");
else
runCommand("ACGCDE('" + accountingCode + "')");
}
// Convenience method for making a command string from array of strings.
static private String setArrayToString(String[] array)
{
int arrayLength = array.length;
if (arrayLength == 0) return NONE;
if (arrayLength == 1) return array[0];
StringBuffer string = new StringBuffer(array[0]);
for (int i = 1; i < arrayLength; ++i)
{
string.append(" ");
string.append(array[i]);
}
return string.toString();
}
/**
* Sets which user interface to use.
*
* @param assistanceLevel The user interface to use. Possible values are:
*
* - "*SYSVAL" - The assistance level defined in the system value QASTLVL is used.
*
- "*BASIC" - The Operational Assistant user interface is used.
*
- "*INTERMED" - The system user interface is used.
*
- "*ADVANCED" - The expert system user interface is used. To allow for more list
* entries, option keys and function keys are not displayed. If a command does not have an
* advanced (*ADVANCED) level, the intermediate (*INTERMED) level is used.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
**/
public void setAssistanceLevel(String assistanceLevel) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (assistanceLevel == null)
{
Trace.log(Trace.ERROR, "Parameter 'assistanceLevel' is null.");
throw new NullPointerException("assistanceLevel");
}
runCommand("ASTLVL(" + assistanceLevel + ")");
}
/**
* Sets the program to be used as the Attention (ATTN) key handling program for this user. The ATTN key handling
* program is called when the ATTN key is pressed during an interactive job. The program is active only when the
* user routes to the system-supplied QCMD processor. The ATTN key handling program is set on before the initial
* program (if any) is called and it is active for both program and menu. If the program changes the ATNPGM (by
* using the SETATNPGM command), the new program remains active only for the duration of the program. When contol
* returns and QCMD call the menu, the original ATTN key handling program becomes active again. If the SETATNPGM
* command is run from the menues or an application is called from the menues, the new ATTN key handling program
* that is specified overrides the original ATTN key handling program. If *YES or *PARTIAL is specified for the
* Limit capabilites (LMTCPB) parameter on the Create User Profile (CRTUSRPRF) or Change User Profile (CHGUSRPRF)
* command, the ATTN key handling program cannot be changed. The caller must have *USE authority to the specified
* program.
*
* @param attentionKeyHandlingProgram The program to be used as the Attention (ATTN) key handling program for this
* user. Possible values are:
*
* - "*SYSVAL" - The system value QATNPGM is used.
*
- {@link #NONE NONE} - No ATTN key handling program is used by this user.
*
- "*ASSIST" - The Operational Assistant ATTN key handling program, QEZMAIN,
* is used.
*
- The fully qualified integrated file system path name of the attention key
* handling program.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see QSYSObjectPathName
**/
public void setAttentionKeyHandlingProgram(String attentionKeyHandlingProgram) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (attentionKeyHandlingProgram == null)
{
Trace.log(Trace.ERROR, "Parameter 'attentionKeyHandlingProgram' is null.");
throw new NullPointerException("attentionKeyHandlingProgram");
}
if (attentionKeyHandlingProgram.length() == 0 || attentionKeyHandlingProgram.startsWith("*"))
runCommand("ATNPGM(" + attentionKeyHandlingProgram + ")");
else
{
QSYSObjectPathName ifs = new QSYSObjectPathName(attentionKeyHandlingProgram, "PGM");
runCommand("ATNPGM(" + ifs.getLibraryName() + "/" + ifs.getObjectName() + ")");
}
}
/**
* Set the additional authentication methods used when authenticating a user.
*
* Note: This method should not be used when running to IBM i 7.5 or earlier releases.
*
* @param authenticationMethods String array containing the authentication methods to set. Possible values:
*
* - {@link #NONE NONE} - No additional authentication methods are used.
*
- {@link #AUTHENTICATION_METHOD_TOTP TOTP} - The time-based one-time password
* (TOTP) authentication method is used in addition to user ID and password
* authentication.
*
- {@link #AUTHENTICATION_METHOD_REGFAC REGFAC} - The exit program registered under
* exit point QIBM_QSY_AUTH will be called during user ID and password authentication.
*
*
* The authentication method {@link #NONE NONE}, if specified, must be the only value
* in the array. Passing a zero-length array is equivalent to passing an array with
* {@link #NONE NONE}.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @throws RequestNotSupportedException If the request is not supported.
* @throws ObjectDoesNotExistException If the object does not exist.
*/
public void setAuthenticationMethods(String[] authenticationMethods)
throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException, RequestNotSupportedException
{
if (authenticationMethods == null)
{
Trace.log(Trace.ERROR, "Parameter 'authenticationMethods' is null.");
throw new NullPointerException("authenticationMethods");
}
if (system_.getVRM() <= 0x00070500)
{
String currentRelease = system_.getVersion() + "." + system_.getRelease();
throw new RequestNotSupportedException(currentRelease, RequestNotSupportedException.SYSTEM_LEVEL_NOT_CORRECT);
}
String authMethods = NONE;
if (authenticationMethods.length > 0)
{
authMethods = "";
for (int i=0; i
* A CCSID is a 16-bit number identifying a specific set of encoding scheme identifiers, character set identifiers,
* code page identifiers, and additional coding-related information that uniquely identifies the coded graphic
* representation used.
*
* Note: If the value for CCSID is changed, the change does not affect job that are currently running.
*
* @param ccsid The character code set identifier (CCSID) to be used for this user. Possible values are:
*
* - -2 - The system value QCCSID is used to determine the user's character code set ID.
*
- A character code set ID.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
**/
public void setCCSID(int ccsid) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
runCommand("CCSID(" + (ccsid == -2 ? "*SYSVAL" : Integer.toString(ccsid)) + ")");
}
/**
* Sets the character code set identifier (CCSID) to be used for this user.
*
* A CCSID is a 16-bit number identifying a specific set of encoding scheme identifiers, character set identifiers,
* code page identifiers, and additional coding-related information that uniquely identifies the coded graphic
* representation used.
*
* Note: If the value for CCSID is changed, the change does not affect job that are currently running.
*
* @param ccsid The character code set identifier (CCSID) to be used for this user. Possible values are:
*
* - "*SYSVAL" - The system value QCCSID is used to determine the user's character code set ID.
*
- "*HEX" - The CCSID 65535 is used.
*
- A character code set ID.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
**/
public void setCCSID(String ccsid) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (ccsid == null)
{
Trace.log(Trace.ERROR, "Parameter 'ccsid' is null.");
throw new NullPointerException("ccsid");
}
runCommand("CCSID(" + ccsid + ")");
}
/**
* Sets the character identifier control (CHRIDCTL) for the job. This attribute controls the type of coded character
* set identifier (CCSID) conversion that occurs for display files, printer files and panel groups. The *CHRIDCTL
* special value must be specified for the Character identifier (CHRID) parameter an the create, change, or override
* commands for display files, printer files, and panel groups before this attribute will be used.
*
* @param chridControl The character identifier control (CHRIDCTL) for the job. Possible values are:
*
* - "*SYSVAL" - The system value QCHRIDCTL is used.
*
- "*DEVD" - The *DEVD special value performs the same function as on the CHRID command
* parameter for display files, printer files, and panel groups.
*
- "*JOBCCSID" - The *JOBCCSID special value performs the same function as on the CHRID
* command parameter for display files, printer files, and panel groups.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getCHRIDControl
**/
public void setCHRIDControl(String chridControl) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (chridControl == null)
{
Trace.log(Trace.ERROR, "Parameter 'chridControl' is null.");
throw new NullPointerException("chridControl");
}
runCommand("CHRIDCTL(" + chridControl + ")");
}
/**
* Sets the country or region identifier to be used for this user.
*
* @param countryID The country or region identifier to be used for this user. Possible values are:
*
* - "*SYSVAL" - The system value QCNTRYID is used.
*
- A country or region identifier.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getCountryID
**/
public void setCountryID(String countryID) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (countryID == null)
{
Trace.log(Trace.ERROR, "Parameter 'countryID' is null.");
throw new NullPointerException("countryID");
}
runCommand("CNTRYID(" + countryID + ")");
}
/**
* Sets the name of the current library associated with the job being run.
*
* Specifies the name of the library to be used as the current library for this user. If *PARTIAL or *YES is
* specified for the Limit capabilities (LMTCPB) parameter of the Create User Profile (CRTUSRPRF) or Change User
* Profile (CHGUSRPRF) command, the user cannot change the current library at sign-on or with the Change Profile
* (CHGPRF) command.
*
* The caller must have *USE authority to the specified library.
*
* @param currentLibraryName The name of the current library associated with the job being run. Possible values are:
*
* - "*CRTDFT" - The user has no current library. The library QGPL is used as the
* default current library.
*
- A library name.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getCurrentLibraryName
**/
public void setCurrentLibraryName(String currentLibraryName) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (currentLibraryName == null)
{
Trace.log(Trace.ERROR, "Parameter 'currentLibraryName' is null.");
throw new NullPointerException("currentLibraryName");
}
runCommand("CURLIB(" + currentLibraryName + ")");
}
/**
* Sets the text that briefly describes the object.
*
* @param description The text that briefly describes the object. Possible values are:
*
* - "*BLANK" - No text is specified.
*
- No more than 50 characters of text.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getDescription
**/
public void setDescription(String description) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (description == null)
{
Trace.log(Trace.ERROR, "Parameter 'description' is null.");
throw new NullPointerException("description");
}
if (description.equals("*BLANK"))
runCommand("TEXT(*BLANK)");
else
runCommand("TEXT('" + description + "')");
}
/**
* Sets whether the sign-on information display is shown.
*
* @param displaySignOnInformation Whether the sign-on information display is shown. Possible values are:
*
* - "*SYSVAL" - The system value QDSPSGNINF is used to determine whether the
* sign-on information display is shown.
*
- "*NO" - The sign-on information display is not shown.
*
- "*YES" - The sign-on information display is shown.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getDisplaySignOnInformation
**/
public void setDisplaySignOnInformation(String displaySignOnInformation) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (displaySignOnInformation == null)
{
Trace.log(Trace.ERROR, "Parameter 'displaySignOnInformation' is null.");
throw new NullPointerException("displaySignOnInformation");
}
runCommand("DSPSGNINF(" + displaySignOnInformation + ")");
}
/**
* Sets the specific authority given to the group profile for newly created objects. If *GRPPRF is specified for the
* Owner (OWNER) parameter, specification of this parameter is not allowed.
*
* @param groupAuthority The specific authority given to the group profile for newly created objects. Possible
* values are:
*
* - {@link #NONE NONE} - No group authority is given.
*
- "*ALL" - The user can perform all operations execept those limited to the owner or
* controlled by authorization list management (*AUTLMGT) authority. The user can control the
* object's existence, specify the security for the object, change the object, and perform
* basic functions on the object. The user can also change ownership of the object.
*
- "*CHANGE" - The user can perform all operations execept those limited to the owner or
* controlled by the object existence (*OBJEXIST) and object management (*OBJMGT) authorities.
* The user can change and perform basic functions on the object. *CHANGE authority provides
* object operational (*OBJOPR) authority and all data authority. If the object is an
* authorization list, the user cannot add, change, or remove users.
*
- "*USE" - The user can perform basic operations on the object, such as running a program
* or reading a file. The user cannot change the object. User (*USE) authority provides object
* operational (*OBJOPR), read (*READ), and execute (*EXECUTE) authorities.
*
- "*EXCLUDE" - The user cannot access the object.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getGroupAuthority
**/
public void setGroupAuthority(String groupAuthority) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (groupAuthority == null)
{
Trace.log(Trace.ERROR, "Parameter 'groupAuthority' is null.");
throw new NullPointerException("groupAuthority");
}
runCommand("GRPAUT(" + groupAuthority + ")");
}
/**
* Sets the type of authority to be granted to the group profile for newly-created objects. If {@link #NONE NONE} is
* specified for the Group Authority (GRPAUT) parameter, specification of this parameter is ignored.
*
* @param groupAuthorityType The type of authority to be granted to the group profile for newly-created objects.
* Possible values are:
*
* - "*PRIVATE" - The group profile is granted private authority to newly-created
* objects, with the authority value determined by the GRPAUT parameter. If the authority
* value in the GRPAUT parameter is {@link #NONE NONE}, this value is ignored.
*
- "*PGP" - The group profile is the primary group for newly-created objects, with the
* authority value determined by the GRPAUT parameter. If the authority value in the
* GRPAUT parameter is {@link #NONE NONE}, this value is ignored.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getGroupAuthorityType
**/
public void setGroupAuthorityType(String groupAuthorityType) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (groupAuthorityType == null)
{
Trace.log(Trace.ERROR, "Parameter 'groupAuthorityType' is null.");
throw new NullPointerException("groupAuthorityType");
}
runCommand("GRPAUTTYP(" + groupAuthorityType + ")");
}
/**
* Sets the group ID number (gid number) for this user profile. The gid number is used to identify the group profile
* when a member of the group is using the directory file system. The gid number for a user may not be changed if:
*
* - The user profile is the primary group of an object in a directory.
*
- There are one or more active jobs for the user.
*
*
* @param groupID The group ID number (gid number) for this user profile. Possible values are:
*
* - 0 - The user does not have a gid number or an existing gid number is removed.
*
* Note: This value cannot be specified if the user is a group profile or the primary group of an
* object.
*
- 1-4294967294 - The gid number to be assigned to the user profile. The gid number assigned must
* not already be assigned to another user profile.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getGroupID
**/
public void setGroupID(long groupID) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (groupID == 0)
runCommand("GID(*NONE)");
else
runCommand("GID(" + Long.toString(groupID) + ")");
}
/**
* Sets the group ID number (gid number) for this user profile. The gid number is used to identify the group profile
* when a member of the group is using the directory file system. The gid number for a user may not be changed if:
*
* - The user profile is the primary group of an object in a directory.
*
- There are one or more active jobs for the user.
*
*
* @param groupID The group ID number (gid number) for this user profile. Possible values are:
*
* - {@link #NONE NONE} - The user does not have a gid number or an existing gid number is removed.
*
* Note: This value cannot be specified if the user is a group profile or the primary group of an
* object.
*
- "*GEN" - The gid number will be generated for the user. The system generates a gid number that
* is not already assigned to another user. The gid number generated is greater than 100.
*
- 1-4294967294 - The gid number to be assigned to the user profile. The gid number assigned must
* not already be assigned to another user profile.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getGroupID
**/
public void setGroupID(String groupID) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (groupID == null)
{
Trace.log(Trace.ERROR, "Parameter 'groupID' is null.");
throw new NullPointerException("groupID");
}
runCommand("GID(" + groupID + ")");
}
/**
* Sets the user's group profile name whose authority is used if no specific authority is given for the user. The
* caller must have object management (*OBJMGT) and change (*CHANGE) authority to the profile specified for the
* Group profile (GRPPRF) parameter. The required *OBJMGT authority cannot be given by a program adopt operation.
*
* @param groupProfileName The user's group profile name whose authority is used if no specific authority is given
* for the user. Possible values are:
*
* - {@link #NONE NONE} - The user profile has no group profile.
*
- The name of the group profile used with this user profile.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getGroupProfileName
**/
public void setGroupProfileName(String groupProfileName) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (groupProfileName == null)
{
Trace.log(Trace.ERROR, "Parameter 'groupProfileName' is null.");
throw new NullPointerException("groupProfileName");
}
runCommand("GRPPRF(" + groupProfileName + ")");
}
/**
* Sets the highest scheduling priority the user is allowed to have for each job submitted to the system. This value
* controls the job processing priority and output priority for any job running under this user profile; that is,
* values specified in the JOBPTY and OUTPTY parameters of any job command cannot exceed the PTYLMT value of the
* user profile under which the job is run. The scheduling priority can have a value ranging from 0 through 9, where
* 0 is the highest priority and 9 is the lowest priority.
*
* @param highestSchedulingPriority The highest scheduling priority the user is allowed to have for each job
* submitted to the system.
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getHighestSchedulingPriority
**/
public void setHighestSchedulingPriority(int highestSchedulingPriority) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
runCommand("PTYLMT(" + Integer.toString(highestSchedulingPriority) + ")");
}
/**
* Sets the path name of the home directory for this user profile. The home directory is the user's initial working
* directory. The working directory, associated with a process, is used during path name resolution in the directory
* file system for path names that do not begin with a slash (/). If the home directory specified does not exist
* when the user signs on, the user's initial working directory is the root (/) directory.
*
* @param homeDirectory The path name of the home directory for this user profile. Possible values are:
*
* - "*USRPRF" - The home directory assigned to the user will be /home/USRPRF, where USRPRF
* is the name of the user profile.
*
- The path name of the home directory to be assigned to this user.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getHomeDirectory
**/
public void setHomeDirectory(String homeDirectory) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (homeDirectory == null)
{
Trace.log(Trace.ERROR, "Parameter 'homeDirectory' is null.");
throw new NullPointerException("homeDirectory");
}
if (homeDirectory.length() == 0 || homeDirectory.startsWith("*"))
runCommand("HOMEDIR(" + homeDirectory + ")");
else
runCommand("HOMEDIR('" + homeDirectory + "')");
}
/**
* Sets the initial menu displayed when the user signs on the system if the user's routing program is the command
* processor. If *YES is specified for the Limit capabilities (LMTCPB) parameter, the user cannot change the menu
* either at sign-on or with the Change Profile (CHGPRF) command.
*
* A System/36 environment menu can be specified as the initial menu if either of the following conditions are true:
*
* - *S36 is specified for the Special environments (SPCENV) parameter.
*
- *SYSVAL is specified on the SPCENV parameter and the system value, QSPCENV, is *S36.
*
*
* The caller must have *USE authority to the specified menu.
*
* @param initialMenu The initial menu displayed when the user signs on the system if the user's routing program is
* the command processor. Possible values are:
*
* - "*SIGNOFF" - The system signs off the user when the program completes. This is intended
* for users authorized only to run the program.
*
- The fully qualified integrated file system path name of the initial menu.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see QSYSObjectPathName
* @see #getInitialMenu
**/
public void setInitialMenu(String initialMenu) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (initialMenu == null)
{
Trace.log(Trace.ERROR, "Parameter 'initialMenu' is null.");
throw new NullPointerException("initialMenu");
}
if (initialMenu.length() == 0 || initialMenu.startsWith("*"))
runCommand("INLMNU(" + initialMenu + ")");
else
{
QSYSObjectPathName ifs = new QSYSObjectPathName(initialMenu, "MNU");
runCommand("INLMNU(" + ifs.getLibraryName() + "/" + ifs.getObjectName() + ")");
}
}
/**
* Sets, for an interactive job, the program called whenever a new routing step is started that has QCMD as the
* request processing program. If *PARTIAL or *YES is specified for the Limit capabilities parameter, the program
* value cannot be changed at sign on or by using the Change Profile (CHGPRF) command. No parameters can be passed
* to the program.
*
* A System/36 environment procedure name can be specified as the initial program if the procedure is a member of
* the file QS36PRC (in the library list or specified library) and if either of the following conditions are true:
*
* - *36 is specified on the SPCENV parameter.
*
- *SYSVAL is specified on the SPCENV parameter and the system value, QSPCENV is *S36.
*
*
* The caller must have *USE authority to the specified program.
*
* @param initialProgram The initial program for the user. Possible values are:
*
* - {@link #NONE NONE} - No program is called when the user signs on. If a menu name is
* specified in the Initial menu (INLMNU) parameter, that menu is displayed.
*
- The fully qualified integrated file system path name of the initial program for the
* user.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see QSYSObjectPathName
* @see #getInitialProgram
**/
public void setInitialProgram(String initialProgram) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (initialProgram == null)
{
Trace.log(Trace.ERROR, "Parameter 'initialProgram' is null.");
throw new NullPointerException("initialProgram");
}
if (initialProgram.length() == 0 || initialProgram.startsWith("*"))
runCommand("INLPGM(" + initialProgram + ")");
else
{
QSYSObjectPathName ifs = new QSYSObjectPathName(initialProgram, "PGM");
runCommand("INLPGM(" + ifs.getLibraryName() + "/" + ifs.getObjectName() + ")");
}
}
/**
* Sets the fully qualified integrated file system path name of the job description used for jobs that start through
* subsystem work station entries. If the job description does not exist when the user profile is created or
* changed, a library qualifier must be specified, because the job description name is kept in the user profile. The
* caller must have *USE authority to the specified job description.
*
* @param jobDescription The fully qualified integrated file system path name of the job description used for jobs
* that start through subsystem work station entries.
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see QSYSObjectPathName
* @see #getJobDescription
**/
public void setJobDescription(String jobDescription) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (jobDescription == null)
{
Trace.log(Trace.ERROR, "Parameter 'jobDescription' is null.");
throw new NullPointerException("jobDescription");
}
if (jobDescription.length() == 0 || jobDescription.startsWith("*"))
runCommand("JOBD(" + jobDescription + ")");
else
{
QSYSObjectPathName ifs = new QSYSObjectPathName(jobDescription, "JOBD");
runCommand("JOBD(" + ifs.getLibraryName() + "/" + ifs.getObjectName() + ")");
}
}
/**
* Sets the keyboard buffering value to be used when a job is initialized for this user profile. If the type-ahead
* feature is active, you can buffer your keyboard strokes. If the attention key buffering option is active, the
* attention key is buffered as any other key. If it is not active, the attention key is not buffered and is sent to
* the system even if the display station is input-inhibited. This value can alse be set by a user application.
*
* @param keyboardBuffering The keyboard buffering value to be used when a job is initialized for this user profile.
* Possible values are:
*
* - "*SYSVAL" - The system value, QKBDBUF, is used to determine the keyboard buffering
* value.
*
- "*NO" - The type-ahead and attention-key buffering options are not active.
*
- "*TYPEAHEAD" - The type-ahead option is active, but the attention key buffering
* option is not.
*
- "*YES" - The type-ahead and attention key buffering options are active.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getKeyboardBuffering
**/
public void setKeyboardBuffering(String keyboardBuffering) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (keyboardBuffering == null)
{
Trace.log(Trace.ERROR, "Parameter 'keyboardBuffering' is null.");
throw new NullPointerException("keyboardBuffering");
}
runCommand("KBDBUF(" + keyboardBuffering + ")");
}
/**
* Sets the language ID to be used for this user.
*
* @param languageID The language ID to be used for this user. Possible values are:
*
* - "*SYSVAL" - The system value QLANGID is used.
*
- The language ID to be used.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getLanguageID
**/
public void setLanguageID(String languageID) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (languageID == null)
{
Trace.log(Trace.ERROR, "Parameter 'languageID' is null.");
throw new NullPointerException("languageID");
}
runCommand("LANGID(" + languageID + ")");
}
/**
* Sets the limit to which the user can control the program, menu, current library, and the ATTN key handling
* program values. It alse determines whether the user can run commands from the command line. This parameter is
* ignored when the security level is 10.
*
* Note: When creating or changing other users' user profile, you cannot specify values on this parameter that grant
* greater capabilities to other users than your own user profile grants to you. For example, if *PARTIAL is
* specified for the Limit capabilities (LMTCPB) parameter in your user profile, you can specify *PARTIAL or *YES
* for anther user. You cannot specify *NO for another user.
*
* @param limitCapabilities The limit to which the user can control the program, menu, current library, and the ATTN
* key handling program values. Possible values are:
*
* - "*NO" - The program, menu, and current library values can be changed when the usre
* signs on the system. User may change the program, menu, current library, or ATTN key
* handling program values is the own user profiles with the Change Profile (CHGPRF)
* command. Commands can be run from a command line.
*
- "*PARTIAL" - The program and current library cannot be changed on the sign-on
* display. The menu can be changed and comands can be run from a command line. A user can
* change the menu value with the Change profile (CHGPRF) command. The program, current
* library, and the ATTN key handling program cannot be changed using the CHGPRF command.
*
- "*YES" - The program, menu, and current library values cannot be changed on the
* sign-on display. Commands cannot be run when issued from a command line or by selecting
* an option from a command grouping menu such as CMDADD, but can still be run from a
* command entry screen. The user cannot change the program, menu, current library, or the
* ATTN key program handling values by using the CHGPRF command.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getLimitCapabilities
**/
public void setLimitCapabilities(String limitCapabilities) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (limitCapabilities == null)
{
Trace.log(Trace.ERROR, "Parameter 'limitCapabilities' is null.");
throw new NullPointerException("limitCapabilities");
}
runCommand("LMTCPB(" + limitCapabilities + ")");
}
/**
* Sets if the number of device sessions allowed for a user is limited to 1. This does not limit SYSREQ and second
* sign-on. Note: Values "0-9" are only valid when running to IBM i 6.1 or higher.
*
* @param limitDeviceSessions If the number of device sessions allowed for a user is limited to 1. Possible values
* are:
*
* - "*SYSVAL" - The system value QLMTDEVSSN is used to determine whether the user is
* limited to a single device session.
*
- "*NO" - The user is not limited to one device session.
*
- "*YES" - The user is limited to one session.
*
- "0" - The user is not limited to a specific number of device session. The value
* has the same meaning as *NO.
*
- "1" - The user is limited to a single device session. The value has the same
* meaning as *YES.
*
- "2-9" - The user is limited to the specified number of device sessions.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getLimitDeviceSessions
**/
public void setLimitDeviceSessions(String limitDeviceSessions) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (limitDeviceSessions == null)
{
Trace.log(Trace.ERROR, "Parameter 'limitDeviceSessions' is null.");
throw new NullPointerException("limitDeviceSessions");
}
runCommand("LMTDEVSSN(" + limitDeviceSessions + ")");
}
/**
* Sets which job attributes are to be taken from the locale specified for the Locale (LOCALE) parameter when the
* job is initiated.
*
* @param localeJobAttributes A list of attributes which are set from the locale path name at the time a job is
* started for this user. Possible values for the elements of this array are:
*
* - "*SYSVAL" - The system value, QSETJOBATR, is used to determine which job
* attributes are taken from the locale.
*
- {@link #NONE NONE} - No job attributes are taken from the locale.
*
- "*CCSID" - The coded character set identifier from the locale is used. The CCSID
* value from the locale overrides the user profile CCSID.
*
- "*DATFMT" - The date format from the locale is used.
*
- "*DATSEP" - The date separator from the locale is used.
*
- "*DECFMT" - The decimal format from the locale is used.
*
- "*SRTSEQ" - The sort sequence from the locale is used. The sort sequence from the
* locale overrides the user profile sort sequence.
*
- "*TIMSEP" - The time separator from the locale is used.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getLocaleJobAttributes
**/
public void setLocaleJobAttributes(String[] localeJobAttributes) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (localeJobAttributes == null)
{
Trace.log(Trace.ERROR, "Parameter 'localeJobAttributes' is null.");
throw new NullPointerException("localeJobAttributes");
}
runCommand("SETJOBATR(" + setArrayToString(localeJobAttributes) + ")");
}
/**
* Sets the path name of the locale that is assigned to LANG environment variable for this user.
*
* @param localePathName The locale path name that is assigned to the user profile when a job is started. Possible
* values are:
*
* - "*SYSVAL" - The system value QLOCALE is used to determine the locale path name to be
* assigned for this user.
*
- {@link #NONE NONE} - No locale path name is assigned for this user.
*
- "*C" - The C locale path name is assigned for this user.
*
- "*POSIX" - The POSIX locale path name is assigned for this user.
*
- The path name of the locale to be assigned for this user.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getLocalePathName
**/
public void setLocalePathName(String localePathName) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (localePathName == null)
{
Trace.log(Trace.ERROR, "Parameter 'localePathName' is null.");
throw new NullPointerException("localePathName");
}
if (localePathName.length() == 0 || localePathName.startsWith("*"))
{
runCommand("LOCALE(" + localePathName + ")");
}
else
{
runCommand("LOCALE('" + localePathName + "')");
}
}
/**
* Sets whether the user profile password should be managed locally.
*
* @param localPasswordManagement true if the password will be managed on the local system, false otherwise.
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #isLocalPasswordManagement
**/
public void setLocalPasswordManagement(boolean localPasswordManagement) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
runCommand("LCLPWDMGT(" + (localPasswordManagement ? "*YES" : "*NO") + ")");
}
/**
* Sets the maximum amount of auxiliary storage (in kilobytes) assigned to store permanant objects owned by this
* user profile (1 kilobyte equals 1024 bytes). If the maximum is exceeded, when an interactive user tries to create
* an object, an error message is displayed, and the object is not created. If the maximum is exceeded when an
* object is created in a batch job, an error message is sent to the job log (depending on the logging level of the
* job), and the object is not created.
*
* Storage is allocated in 4K increments. Therefore, if you specify MAXSTG (9), the profile is allocated 12K of
* storage.
*
* When planning maximum storage for user profiles, consider the following system actions:
*
* - A restore operation assigns the storage to the user doing the restore, and then transfers the object to the
* owner. For a large restore, specify MAXSTG(*NOMAX).
*
- The user profile that creates a journal receiver is assigned the required storage as the receiver size grows.
* If new receivers are created using JRNRCV(*GEN), the storage continues to be assigned to the user profile that
* wons the active journal receiver. If a very active journal receiver is owned, specify MAXSTG(*NOMAX).
*
- User profiles that transfer created objects to their group profile must have adequate storage in the user
* profiles to contain created objects before the objects are transferred to the group profile.
*
- The owner of the library is assigned the storage for the descriptions of objects which are stored in a
* library, even when the objects are owned by another user profile. Examples of such objects are text and program
* references.
*
*
* @param maximumStorageAllowed The maximum amount of auxiliary storage (in kilobytes) assigned to store permanant
* objects owned by this user profile. Possible values are:
*
* - -1 - As much storage as is required is assigned to this profile (*NOMAX).
*
- The maximum amount of storage for the user, in kilobytes (1 kilobyte equals 1024
* bytes).
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getMaximumStorageAllowed
**/
public void setMaximumStorageAllowed(int maximumStorageAllowed) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
runCommand("MAXSTG(" + (maximumStorageAllowed == -1 ? "*NOMAX" : Integer.toString(maximumStorageAllowed)) + ")");
}
/**
* Sets the maximum amount of auxiliary storage (in kilobytes) assigned to store permanant objects owned by this
* user profile (1 kilobyte equals 1024 bytes). If the maximum is exceeded, when an interactive user tries to create
* an object, an error message is displayed, and the object is not created. If the maximum is exceeded when an
* object is created in a batch job, an error message is sent to the job log (depending on the logging level of the
* job), and the object is not created.
*
* Storage is allocated in 4K increments. Therefore, if you specify MAXSTG (9), the profile is allocated 12K of
* storage.
*
* When planning maximum storage for user profiles, consider the following system actions:
*
* - A restore operation assigns the storage to the user doing the restore, and then transfers the object to the
* owner. For a large restore, specify MAXSTG(*NOMAX).
*
- The user profile that creates a journal receiver is assigned the required storage as the receiver size grows.
* If new receivers are created using JRNRCV(*GEN), the storage continues to be assigned to the user profile that
* wons the active journal receiver. If a very active journal receiver is owned, specify MAXSTG(*NOMAX).
*
- User profiles that transfer created objects to their group profile must have adequate storage in the user
* profiles to contain created objects before the objects are transferred to the group profile.
*
- The owner of the library is assigned the storage for the descriptions of objects which are stored in a
* library, even when the objects are owned by another user profile. Examples of such objects are text and program
* references.
*
*
* @param maximumStorageAllowed The maximum amount of auxiliary storage (in kilobytes) assigned to store permanant
* objects owned by this user profile. Possible values are:
*
* - "*NOMAX" - As much storage as is required is assigned to this profile.
*
- The maximum amount of storage for the user, in kilobytes (1 kilobyte equals 1024
* bytes).
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getMaximumStorageAllowed
**/
public void setMaximumStorageAllowed(String maximumStorageAllowed) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (maximumStorageAllowed == null)
{
Trace.log(Trace.ERROR, "Parameter 'maximumStorageAllowed' is null.");
throw new NullPointerException("maximumStorageAllowed");
}
runCommand("MAXSTG(" + maximumStorageAllowed + ")");
}
/**
* Sets the message queue to which messages are sent.
*
* Note: The message queue is created, if it does not exist. The user profile specified for the User profile
* (USRPRF) parameter is the owner of the message queue.
*
* The caller must have *USE authority to the specified message queue.
*
* @param messageQueue The message queue to which messages are sent. Possible values are:
*
* - "*USRPRF" - A message queue with the same name as that specified for the USRPRF parameter
* is used as the message queue for this user. This message queue is located in the QUSERSYS
* library.
*
- The fully qualified integrated file system path name of the message queue to be used with
* this profile.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see QSYSObjectPathName
* @see #getMessageQueue
**/
public void setMessageQueue(String messageQueue) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (messageQueue == null)
{
Trace.log(Trace.ERROR, "Parameter 'messageQueue' is null.");
throw new NullPointerException("messageQueue");
}
if (messageQueue.length() == 0 || messageQueue.startsWith("*"))
{
runCommand("MSGQ(" + messageQueue + ")");
}
else
{
QSYSObjectPathName ifs = new QSYSObjectPathName(messageQueue, "MSGQ");
runCommand("MSGQ(" + ifs.getLibraryName() + "/" + ifs.getObjectName() + ")");
}
}
/**
* Sets how the messages are sent to the message queue for this user are to be delivered.
*
* @param messageQueueDeliveryMethod How the messages are sent to the message queue for this user are to be
* delivered. Possible values are:
*
* - "*NOTIFY" - The job to which the message queue is assigned is notified when
* a message arrives on the message queue. For interactive jobs at a work station,
* the audible alarm is sounded (if the alarm feature is set) and the Message
* Waiting light is turned on. The delivery mode cannot be changed to *NOTIFY if
* the message queue is also being used by another job.
*
- "*HOLD" - The messages are held in the message queue until they are
* requested by the user or program.
*
- "*BREAK" - The job to which the message queue is assigned is interrupted
* when a message arrives at the message queue. If the job is an interactive job,
* the autdible alarm is sounded (if the alarm feature is set). The delivery mode
* cannot be changed to *BREAK if the message queue is also being used by another
* job.
*
- "*DFT" - The default reply to the inquiry message is sent. If no default
* reply is specified in the message description of the inquiry message, the
* system default reply, *N, is used.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #setMessageQueueDeliveryMethod
**/
public void setMessageQueueDeliveryMethod(String messageQueueDeliveryMethod) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (messageQueueDeliveryMethod == null)
{
Trace.log(Trace.ERROR, "Parameter 'messageQueueDeliveryMethod' is null.");
throw new NullPointerException("messageQueueDeliveryMethod");
}
runCommand("DLVRY(" + messageQueueDeliveryMethod + ")");
}
/**
* Sets the lowest severity code that a message can have and still be delivered to a user in break or notify mode.
* Messages arriving at the message queue whose severities are lower than the the severity code specified for this
* parameter do not interrupt the job or turn on the audible alarm or the message-waiting light; they are held in
* the queue until they are requested by using the Display Message (DSPMSG) command. If *BREAK or *NOTIFY is
* specidied for the Delivery (DLVRY) parameter, and is in effect when a message arrives at the queue, the message
* is delivered if the severity code associated with the message is equal or greater then the value specified here.
* Otherwiese, the message is held in the queue until it is requested.
*
* @param messageQueueSeverity A severity code ranging from 00 through 99.
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getMessageQueueSeverity
**/
public void setMessageQueueSeverity(int messageQueueSeverity) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
runCommand("SEV(" + Integer.toString(messageQueueSeverity) + ")");
}
/**
* Sets the user profile name. This does not change the name of the user profile on the system. Instead, it changes
* the user profile to which this User object references. This property cannot be changed if the object has
* established a connection to the system.
*
* @param name The user profile name.
* @exception PropertyVetoException If any of the registered listeners vetos the property change.
* @see #getName
**/
public void setName(String name) throws PropertyVetoException
{
if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "Setting name: " + name);
if (name == null)
{
Trace.log(Trace.ERROR, "Parameter 'name' is null.");
throw new NullPointerException("name");
}
name = name.trim();
if (name.length() > 10)
{
Trace.log(Trace.ERROR, "Length of parameter 'name' is not valid: '" + name + "'");
throw new ExtendedIllegalArgumentException("name (" + name + ")", ExtendedIllegalArgumentException.LENGTH_NOT_VALID);
}
if (name.equalsIgnoreCase(NONE))
{
Trace.log(Trace.ERROR, "Value of parameter 'name' is not valid: '" + name + "'");
throw new ExtendedIllegalArgumentException("name (" + name + ")", ExtendedIllegalArgumentException.PARAMETER_VALUE_NOT_VALID);
}
if (connected_)
{
Trace.log(Trace.ERROR, "Cannot set property 'name' after connect.");
throw new ExtendedIllegalStateException("name", ExtendedIllegalStateException.PROPERTY_NOT_CHANGED);
}
if (propertyChangeListeners_ == null && vetoableChangeListeners_ == null)
name_ = name.toUpperCase();
else
{
String oldValue = name_;
String newValue = name.toUpperCase();
if (vetoableChangeListeners_ != null)
vetoableChangeListeners_.fireVetoableChange("name", oldValue, newValue);
name_ = newValue;
if (propertyChangeListeners_ != null)
propertyChangeListeners_.firePropertyChange("name", oldValue, newValue);
}
}
/**
* Sets the object auditing value for the user. This value only takes effect if the object auditing (OBJAUD) value
* for the object being accessed has the value *USRPRF.
*
* Implementation note: The method internally calls the Change User Auditing (CHGUSRAUD) command and not the Change
* User Profile (CHGUSRPRF) command. The caller must have audit (*AUDIT) special authority. Changes take effect the
* next time a job is started for this user.
*
* @param objectAuditingValue The object auditing value for the user. Possible values are:
*
* - {@link #NONE NONE} - The auditing value for the object determines when auditing is
* performed.
*
- "*CHANGE" - All changes accesses by this user on all objects with the *USRPRF
* audit value are logged.
*
- "*ALL" - All change and read accesses by this use on all objects with the *USRPRF
* audit value are logged.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getObjectAuditingValue
**/
public void setObjectAuditingValue(String objectAuditingValue) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (objectAuditingValue == null)
{
Trace.log(Trace.ERROR, "Parameter 'objectAuditingValue' is null.");
throw new NullPointerException("objectAuditingValue");
}
runCommandAud("OBJAUD(" + objectAuditingValue + ")");
}
/**
* Sets the output queue to be used by this user profile. The output queue must already exist when this command is
* run. The caller must have *USE authority to the specified output queue.
*
* @param outputQueue The output queue to be used by this user profile. Possible values are:
*
* - "*WRKSTN" - The output queue assigned to the user's work station is used.
*
- "*DEV" - The output queue associated with the printer specified for the Print device
* (PRTDEV) parameter is used. The output queue has the same name as the printer. (The pringer
* file DEV parameter is determined by the CRTPRTF, CHGPRTF, or the OVRPRTF command).
*
* Note: This assumes the defaults are specified for the Output queue (OUTQ) parameter for the
* printer file, job description, user profile, and workstation.
*
- The fully qualified integrated file system path name of the output queue to be used by
* this user profile.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see QSYSObjectPathName
* @see #getOutputQueue
**/
public void setOutputQueue(String outputQueue) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (outputQueue == null)
{
Trace.log(Trace.ERROR, "Parameter 'outputQueue' is null.");
throw new NullPointerException("outputQueue");
}
if (outputQueue.length() == 0 || outputQueue.startsWith("*"))
runCommand("OUTQ(" + outputQueue + ")");
else
{
QSYSObjectPathName ifs = new QSYSObjectPathName(outputQueue, "OUTQ");
runCommand("OUTQ(" + ifs.getLibraryName() + "/" + ifs.getObjectName() + ")");
}
}
/**
* Sets the user profile that is to be the owner of objects created by this user.
*
* @param owner The user profile that is to be the owner of objects created by this user. Possible values are:
*
* - "*USRPRF" - The user profile associated with the job is the owner of the object.
*
- "*GRPPRF" - The group profile is made the owner of newly created objects and has all authority
* to the object. The user profile associated with the job does not have any specific authority to the
* object. If *GRPPRF is specified, a user profile name must be specified for the Group profile
* (GRPPRF) parameter, and the Group authority (GRPAUT) parameter cannot be specified.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getOwner
**/
public void setOwner(String owner) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (owner == null)
{
Trace.log(Trace.ERROR, "Parameter 'owner' is null.");
throw new NullPointerException("owner");
}
runCommand("OWNER(" + owner + ")");
}
/**
* Sets the time period during which a password is blocked from being changed following the prior successful
* password change operation.
*
* Note: This method should not be used when running to IBM i 5.4 or earlier releases.
*
* @param pwdChangeBlock The time period during which a password is blocked from being changed. Possible values are:
*
* - "*SYSVAL" - The system value QPWDCHGBLK is used to determine the block password change
* value.
* - {@link #NONE NONE} - The password can be changed at any time.
* - 1-99 - Indicates the number of hours a user must wait after the prior successful
* password change operation before they are able to change the password again.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getPasswordChangeBlock
*/
public void setPasswordChangeBlock(String pwdChangeBlock) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (pwdChangeBlock == null)
{
Trace.log(Trace.ERROR, "Parameter 'pwdChangeBlock' is null.");
throw new NullPointerException("pwdChangeBlock");
}
runCommand("PWDCHGBLK(" + pwdChangeBlock + ")");
}
/**
* Sets the password expiration interval (in days).
*
* @param passwordExpirationInterval The number of days the user's password can remain active before it must be
* changed. Possible values are:
*
* - 0 - The system value QPWDEXPITV is used to determine the password
* expiration interval (*SYSVAL).
*
- -1 - The password does not expire (*NOMAX).
*
- 1-366 - The number of days between the date when the password is changed
* and the date when the password expires.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getPasswordExpirationInterval
**/
public void setPasswordExpirationInterval(int passwordExpirationInterval) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
runCommand("PWDEXPITV(" + (passwordExpirationInterval == -1 ? "*NOMAX" : passwordExpirationInterval == 0 ? "*SYSVAL" : Integer.toString(passwordExpirationInterval)) + ")");
}
/**
* Sets the password expiration interval (in days).
*
* @param passwordExpirationInterval The number of days the user's password can remain active before it must be
* changed. Possible values are:
*
* - "*SYSVAL" - The system value QPWDEXPITV is used to determine the password
* expiration interval.
*
- "*NOMAX" - The password does not expire.
*
- 1-366 - The number of days between the date when the password is changed
* and the date when the password expires.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getPasswordExpirationInterval
**/
public void setPasswordExpirationInterval(String passwordExpirationInterval) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (passwordExpirationInterval == null)
{
Trace.log(Trace.ERROR, "Parameter 'passwordExpirationInterval' is null.");
throw new NullPointerException("passwordExpirationInterval");
}
runCommand("PWDEXPITV(" + passwordExpirationInterval + ")");
}
/**
* Sets whether the password for this user is set to expired. If the password is set to expired, the user is
* required to change the password to sign on to the system. When the user attempts to sign on to the system, the
* sign-on information display is shown and the user has the option to change this password.
*
* @param passwordSetExpire true if the password set to expired, false otherwise.
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #isPasswordSetExpire
**/
public void setPasswordSetExpire(boolean passwordSetExpire) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
runCommand("PWDEXP(" + (passwordSetExpire ? "*YES" : "*NO") + ")");
}
/**
* Sets the default printer device for this user. If the pringer file used to create printed output specifies to
* spool the data, the spooled file is placed on the device's output queue, which is named the same as the device.
*
* Note: This assumes the defaults are specified for the Output queue (OUTQ) parameter for the printer file, job
* description, user profile, and workstation.
*
* The caller must have *USE authority to the specified print device.
*
* @param printDevice The default printer device for this user. Possible values are:
*
* - "*WRKSTN" - The printer assigned to the user's work station is used.
*
- "*SYSVAL" - The value specified in the system value QPRTDEV is used.
*
- The name of a printer that is to be used to print the output for this user.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getPrintDevice
**/
public void setPrintDevice(String printDevice) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (printDevice == null)
{
Trace.log(Trace.ERROR, "Parameter 'printDevice' is null.");
throw new NullPointerException("printDevice");
}
runCommand("PRTDEV(" + printDevice + ")");
}
/**
* Sets the sort sequence table to be used for string comparisons for this profile.
*
* @param sortSequenceTable The sort sequence table to be used for string comparisons for this profile. Possible
* values are:
*
* - "*SYSVAL" - The system value QSRTSEQ is used.
*
- "*HEX" - A sort sequence table is not used. The hexadecimal values of the characters
* are used to determine the sort sequence.
*
- "*LANGIDUNQ" - A unique-weight sort table is used
*
- "*LANGIDSHR" - A shared-weight sort table is used.
*
- The fully qualified integrated file system path name of the sort sequence table to
* be used with this profile.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see QSYSObjectPathName
* @see #getSortSequenceTable
**/
public void setSortSequenceTable(String sortSequenceTable) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (sortSequenceTable == null)
{
Trace.log(Trace.ERROR, "Parameter 'sortSequenceTable' is null.");
throw new NullPointerException("sortSequenceTable");
}
if (sortSequenceTable.length() == 0 || sortSequenceTable.startsWith("*"))
runCommand("SRTSEQ(" + sortSequenceTable + ")");
else
{
QSYSObjectPathName ifs = new QSYSObjectPathName(sortSequenceTable, "FILE");
runCommand("SRTSEQ(" + ifs.getLibraryName() + "/" + ifs.getObjectName() + ")");
}
}
/**
* Sets the special authorities given to a user. Special authorities are required to perform certain functions on
* the system. Special authorities cannot be removed from many of the system-supplied user profiles, including
* QSECOFR and QSYS.
*
* The following special authorities are usually given:
*
* - Save system (*SAVSYS) special authority to users who need to operate the system.
*
- Input/output system configuration (*IOSYSCFG) special authority to users who need to change system I/O
* configurations.
*
- Job control (*JOBCTL) special authority is given to the user. The user is given the authority to change,
* display, hold, release, cancel, and clear all jobs that are running on the system or that are on a job queue or
* output queue that has OPRCTL (*YES) specified. The user also has the authority to load the system, to start
* writers, and to stop active subsystems.
*
- Security administrator (*SECADM) special authority to users who need to create, change, or delete user
* profiles.
*
- All object (*ALLOBJ) special authority to users who need to work with system resources.
*
- Service (*SERVICE) special authority to users who need to perform service functions.
*
- Spool control (*SPLCTL) special authority to users who need to perform all spool-related functions.
*
- Audit (*AUDIT) special authority to users who need to perform auditing functions.
*
*
* Restrictions:
*
* - The user profile creating or changing another user profile must have all of the special authorities being
* given. All special authorities are needed to give all special authorities to another user profile.
*
- A user must have *ALLOBJ and *SECADM special authorities to give a user *SECADM special authority when using
* the CHGUSRPRF command.
*
- The user must have *ALLOBJ, *SECADM, and *AUDIT special authorities to give a user *AUDIT special authority
* when using the CHGUSRPRF command.
*
*
* @param specialAuthority The special authorities given to a user. Possible values for the elements of this array
* are:
*
* - "*USRCLS" - Special authorities are granted to this user based on the value specified
* on User class (USRCLS) parameter.
*
- {@link #NONE NONE} - No special authorities are granted to this user.
*
- {@link #SPECIAL_AUTHORITY_ALL_OBJECT SPECIAL_AUTHORITY_ALL_OBJECT} - All object
* authority is given to the user. The user can access any system resource with or without
* private user authorizations.
*
- {@link #SPECIAL_AUTHORITY_AUDIT SPECIAL_AUTHORITY_AUDIT} - Audit authority is granted
* to this user. The user is given the authority to perform auditing functions. Auditing
* functions include turning auditing on or off for the system and controlling the level of
* auditing on an object or user.
*
- {@link #SPECIAL_AUTHORITY_JOB_CONTROL SPECIAL_AUTHORITY_JOB_CONTROL} - Job control
* authority is given to the user. The user has authority to change, display, hold, release,
* cancel, and clear all jobs that are running on the system or that are on a job queue or
* output queue that has OPRCTL (*YES) specified. The user also has the authority to start
* writers and to stop active subsystems.
*
- {@link #SPECIAL_AUTHORITY_SAVE_SYSTEM SPECIAL_AUTHORITY_SAVE_SYSTEM} - Save system
* authority is given to the user profile. This user has the authority to save, restore, and
* free storage for all objects on the system, with or without object management authority.
*
- {@link #SPECIAL_AUTHORITY_IO_SYSTEM_CONFIGURATION
* SPECIAL_AUTHORITY_IO_SYSTEM_CONFIGURATION} - Input/output (I/O) system configuration
* authority is given to the user. The user has authority to change system I/O
* configurations.
*
- {@link #SPECIAL_AUTHORITY_SECURITY_ADMINISTRATOR
* SPECIAL_AUTHORITY_SECURITY_ADMINISTRATOR} - Security administrator authority is given to
* the user. The user can create, change, or delete user profiles if authorized to the
* Create User Profile (CRTUSRPRF), Change User Profile (CHGUSRPRF), or Delete User Profile
* (DLTUSRPRF) commands and is authorized to the user profile. This authority does not allow
* giving special authorities that this user profile does not have. To give *SECADM special
* authority to another user, a user must have both *ALLOBJ and *SECADM special authorities.
*
- {@link #SPECIAL_AUTHORITY_SERVICE SPECIAL_AUTHORITY_SERVICE} - Service authority is
* given to this user. The user can perform service functions.
*
- {@link #SPECIAL_AUTHORITY_SPOOL_CONTROL SPECIAL_AUTHORITY_SPOOL_CONTROL} - Spool
* control authority is given to this user. The user can perform all spool functions.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getSpecialAuthority
* @see #hasSpecialAuthority
**/
public void setSpecialAuthority(String[] specialAuthority) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (specialAuthority == null)
{
Trace.log(Trace.ERROR, "Parameter 'specialAuthority' is null.");
throw new NullPointerException("specialAuthority");
}
runCommand("SPCAUT(" + setArrayToString(specialAuthority) + ")");
}
/**
* Sets the special environment in which the user operates after signing on.
*
* @param specialEnvironment The special environment in which the user operates after signing on. Possible values
* are:
*
* - "*SYSVAL" - The system value, QSPCENV, is used to determine the system environment
* after the user signs on the system.
*
- {@link #NONE NONE} - The user operates in the IBM i system environment after
* signing on the system.
*
- "*S36" - The user operates in the System/36 environment after signing on the
* system.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getSpecialEnvironment
**/
public void setSpecialEnvironment(String specialEnvironment) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (specialEnvironment == null)
{
Trace.log(Trace.ERROR, "Parameter 'specialEnvironment' is null.");
throw new NullPointerException("specialEnvironment");
}
runCommand("SPCENV(" + specialEnvironment + ")");
}
/**
* Sets the status of the user profile.
*
* The system will disable a user profile if the number of failed sign-on attempts reaches the limit specified on
* the QMAXSIGN system value and option 2 or 3 has been specified on the QMAXSGNACN system value.
*
* @param status The status of the user profile. Possible values are:
*
* - "*ENABLED" - The user profile is valid for sign-on.
*
- "*DISABLED" - The user profile is not valid for sign-on until an authorized user enables it
* again. Batch jobs can be submitted under a disabled user profile.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getStatus
**/
public void setStatus(String status) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (status == null)
{
Trace.log(Trace.ERROR, "Parameter 'status' is null.");
throw new NullPointerException("status");
}
runCommand("STATUS(" + status + ")");
}
/**
* Sets the user's supplemental group profiles. The profiles specified here, along with the group profile specified
* for the Group profile (GRPPRF) parameter, are used to determine what authority the user has if no specific user
* authority is given for the job. If profiles are specified for this parameter, a group profile name must be
* specified on the GRPPRF parameter for this user profile (either on this command or on a previous Create User
* Profile (CRTUSRPRF) or Change User Profile (CHGUSRPRF) command. The current user of this command must have object
* management (*OBJMGT) and change (*CHANGE) authority to the profiles specified for this. The required *OBJMGT
* authority cannot be given by a program adopt operation.
*
* Notes:
*
* - When a group profile is specified, the user is automatically granted *CHANGE and *OBJMGT authority to the
* group profile.
*
- The following IBM-supplied user profiles are not valid for this parameter:
*
* QAUTPROF, QCLUMGT, QCLUSTER, QCOLSRV, QDBSHR, QDBSHRDO, QDFTOWN, QDIRSRV, QDLFM, QDOC, QDSNX, QEJB, QFNC, QGATE,
* QIPP, QLPAUTO, QLPINSTALL, QMGTC, QMSF, QNETSPLF, QNFSANON, QNTP, QPEX, QPM400, QRJE, QSNADS, QSPL, QSPLJOB,
* QSRV, QSRVAGT, QSRVBAS, QSYS, QTCM, QTCP, QTFTP, QTSTRQS, QYCMCIMOM, QYPSJSVR
*
*
* @param supplementalGroups The user's supplemental group profiles. Possible values for the elements of this array
* are:
*
* - {@link #NONE NONE} - No supplemental group profiles are used with this user
* profile.
* - The group profile names to be used with this user profile and the group profile
* specified on the GRPPRF parameter to determine a job's eligibility for getting access
* to existing objects and special authority. A maximum of 15 group profile names may be
* specified.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getSupplementalGroups
**/
public void setSupplementalGroups(String[] supplementalGroups) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (supplementalGroups == null)
{
Trace.log(Trace.ERROR, "Parameter 'supplementalGroups' is null.");
throw new NullPointerException("supplementalGroups");
}
runCommand("SUPGRPPRF(" + setArrayToString(supplementalGroups) + ")");
}
/**
* Sets the system object representing the system on which the user profile exists. This property cannot be changed
* if the object has established a connection to the system.
*
* @param system The system object representing the system on which the user profile exists.
* @exception PropertyVetoException If any of the registered listeners vetos the property change.
* @see #getSystem
**/
public void setSystem(AS400 system) throws PropertyVetoException
{
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 (connected_)
{
Trace.log(Trace.ERROR, "Cannot set property 'system' after connect.");
throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_CHANGED);
}
if (propertyChangeListeners_ == null && vetoableChangeListeners_ == null)
system_ = system;
else
{
AS400 oldValue = system_;
AS400 newValue = system;
if (vetoableChangeListeners_ != null)
vetoableChangeListeners_.fireVetoableChange("system", oldValue, newValue);
system_ = system;
if (propertyChangeListeners_ != null)
propertyChangeListeners_.firePropertyChange("system", oldValue, newValue);
}
}
/**
* Sets the level of activity that is audited for this user profile. Note: The system values QAUDLVL and QAUDLVL2
* are used in conjunction with this parameter. Example: If QAUDLVL is set to *DELETE and AUDLVL is set to *CREATE,
* then both *DELETE and *CREATE would be audited for this user. The default value for the QAUDLVL and QAUDLVL2
* system values is {@link #NONE NONE}.
*
* Implementation note: The method internally calls the Change User Auditing (CHGUSRAUD) command and not the Change
* User Profile (CHGUSRPRF) command. The caller must have audit (*AUDIT) special authority. Changes take effect the
* next time a job is started for this user.
*
* @param userActionAuditLevel The level of activity that is audited for this user profile. Possible values for the
* elements of this array are:
*
* - {@link #NONE NONE} - No auditing level is specified. The auditing level for this
* user is taken from system values QAUDLVL and QAUDLVL2.
*
- "*CMD" - CL command strings, System/36 environment operator control commands, and
* System/36 enviromnent procedures are logged for this user.
*
- "*CREATE" - Auditing entries are sent when objects are created by this user.
*
- "*DELETE" - Auditing entries are sent when objects are deleteed by this user.
*
- "*JOBDTA" - The following actions taken by this user that affect a job are
* audited:
*
* - Job start and stop data.
*
- Hold, release, stop, continue, change, disconnect, end, end abnormal.
*
- Program start request (PSR) is attached to a prestart job.
*
* - "*OBJMGT" - Object management changes made by this user, such as move or rename,
* are audited.
*
- "*OFCSRV" - Office services changes made by this user, such as changes to the
* system directory and use of OfficeVision, are audited.
*
- "*OPTICAL" - The following optical functions are audited:
*
* - Add or remove optical cartridge.
*
- Change the authorization list used to secure an optical volume.
*
- Open optical file or directory.
*
- Create or delete optical directory.
*
- Change or retrieve optical directory attributes.
*
- Copy, move, or rename optical file.
*
- Copy optical directory.
*
- Back up optical volume.
*
- Initialize or rename optical volume.
*
- Convert backup optical volume to a primary volume.
*
- Save or release help optical file.
*
- Absolute read of an optical volume.
*
* - "*PGMADP" - Authority obtained through program adoption is audited for this user.
*
- "*SAVRST" - Save and restore actions performed by this user are audited.
*
- "*SECURITY" - Security changes made by this user are audited.
*
- "*SERVICE" - User of the system service tools by this user is audited.
*
- "*SPLFDTA" - Spooled file operations made by this user are audited.
*
- "*SYSMGT" - Use of system management functions by this user are audited.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getUserActionAuditLevel
**/
public void setUserActionAuditLevel(String[] userActionAuditLevel) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (userActionAuditLevel == null)
{
Trace.log(Trace.ERROR, "Parameter 'userActionAuditLevel' is null.");
throw new NullPointerException("userActionAuditLevel");
}
runCommandAud("AUDLVL(" + setArrayToString(userActionAuditLevel) + ")");
}
/**
* Sets the type of user associated with this user profile: security officer, security administrator, programmer,
* system operator, or user. The user class controls the options that are shown on a menu. Special authorities are
* given only if *USRCLS is specified for the Special authority (SPCAUT) parameter. If SPCAUT(*USRCLS) is specified,
* the special authorities granted will differ depending on the QSECURITY value.
*
* @param userClassName The type of user associated with this user profile. Possible values are:
*
* - "*USER" - At QSECURITY level 10 or 20, the user has *ALLOBJ and *SAVSYS authority. At
* QSECURITY level 30 or above, the user has no special authorities.
*
- "*SECOFR" - At all levels of security, the security officer is granted the following
* special authorities:
*
* - *ALLOBJ
*
- *SAVSYS
*
- *JOBCTL
*
- *SERVICE
*
- *SPLCTL
*
- *SECADM
*
- *AUDIT
*
- *IOSYSCFG
*
* - "*SECADM" - At QSECURITY level 10 or 20, the security administrator has *ALLOBJ,
* *SAVSYS, *SECADM, and *JOBCTL special authorities. At QSECURITY level 30 or above, the user
* has *SECADM special authority.
*
- "*PGMR" - At QSECURITY level 10 or 20, the programmer has *ALLOBJ, *SAVSYS, and *JOBCTL
* special authorities. At QSECURITY level 30 or above, the user has no special authorities.
*
- "*SYSOPR" - At QSECURITY level 10 or 20, the system operator has *ALLOBJ, *SAVSYS, and
* *JOBCTL special authorities. At QSECURITY level 30 or above, the user has *SAVSYS and
* *JOBCTL special authorities.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getUserClassName
**/
public void setUserClassName(String userClassName) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (userClassName == null)
{
Trace.log(Trace.ERROR, "Parameter 'userClassName' is null.");
throw new NullPointerException("userClassName");
}
runCommand("USRCLS(" + userClassName + ")");
}
/**
* Sets the date when the user profile expires and is automatically disabled.
*
* Note: Certain IBM-supplied user profiles cannot specify a user expiration date.
*
* Note: This method should not be used when running to IBM i 6.1 or earlier releases.
*
* @param expirationDate The date when the user profile expires and is automatically disabled. null is
* returned if the user profile does not have an expiration date.
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @throws RequestNotSupportedException If the request is not supported.
* @throws ObjectDoesNotExistException If the object does not exist.
* @see #getUserExpirationDate
* @see #setUserExpirationInterval
**/
public void setUserExpirationDate(Date expirationDate)
throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, RequestNotSupportedException, ObjectDoesNotExistException
{
if (system_.getVRM() < 0x00070100)
{
String currentRelease = system_.getVersion() + "." + system_.getRelease();
throw new RequestNotSupportedException(currentRelease, RequestNotSupportedException.SYSTEM_LEVEL_NOT_CORRECT);
}
String expDate;
if (expirationDate == null)
expDate = NONE;
else
{
// The date must be specified in the "job date format".
String jobDateFormat = getJobDateFormat();
byte[] dateBytes = getDateTimeConverter().convert(expirationDate, jobDateFormat);
expDate = DateTimeConverter.formatDateForCommandParameter(dateBytes, jobDateFormat);
}
runCommand("USREXPDATE(" + expDate + ")");
}
/**
* Set the amount of time, in minutes, a time-base one-time password (TOTP) is optional on an authentication request
* for the user. This is the amount of time after a valid user ID and password authentication using a TOTP value is
* performed, that subsequent authentications will be allowed without having to specifying a TOTP value. This value
* is only valid when Authentication method includes *TOTP.
*
* Note: This method should not be used when running to IBM i 7.5 or earlier releases.
*
* @param totpOptionalInterval the TOTP optional interval to set. Valid values include 0-720. A value of zero
* indicates that there is no optional interval, the time-based one-time password must
* be entered for every authentication.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws ExtendedIllegalArgumentException If TOTP optional interval value is not valid.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @throws RequestNotSupportedException If the request is not supported.
* @throws ObjectDoesNotExistException If the object does not exist.
*/
public void setTOTPOptionalInterval(int totpOptionalInterval)
throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, RequestNotSupportedException, ObjectDoesNotExistException
{
if (system_.getVRM() <= 0x00070500)
{
String currentRelease = system_.getVersion() + "." + system_.getRelease();
throw new RequestNotSupportedException(currentRelease, RequestNotSupportedException.SYSTEM_LEVEL_NOT_CORRECT);
}
if (totpOptionalInterval < 0 || totpOptionalInterval > 720)
throw new ExtendedIllegalArgumentException("totpOptionalInterval (" + totpOptionalInterval + ")", ExtendedIllegalArgumentException.RANGE_NOT_VALID);
String totpOptionalIntervalString = null;
if (totpOptionalInterval == 0)
totpOptionalIntervalString = NONE;
runCommand("TOTPOPTITV(" + ((totpOptionalIntervalString != null) ? totpOptionalIntervalString : totpOptionalInterval) + ")");
totpOptionalInterval_ = totpOptionalInterval;
}
// Utility method. Returns this object's internal DateTimeConverter object.
// If we haven't already created dateConverter_, creates it now.
private final DateTimeConverter getDateTimeConverter()
{
if (dateConverter_ == null)
dateConverter_ = new DateTimeConverter(system_);
return dateConverter_;
}
// Utility method. Gets the job date format for the job in which CHGUSRPRF will be run.
private final String getJobDateFormat()
throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException
{
if (jobDateFormat_ == null)
{
// First, get the CommandCall object that will be used to submit the CHGUSRPRF command. This will ensure
// that we're querying the correct job (on-thread versus off-thread).
CommandCall cmd = getCommandCallObject(COMMAND_CHGUSRPRF);
Job job = cmd.getServerJob();
jobDateFormat_ = job.getDateFormat();
}
return jobDateFormat_;
}
/**
* Sets the expiration interval (in days) before the user profile is automatically disabled. If the user profile
* does not have a user expiration date, or the user profile has expired and the Status parameter is set to
* *ENABLED, specifies the number of days between today and the new date when the user profile expires. If the user
* profile has not yet expired, the user expiration interval is changed, but the existing user expiration date is
* not changed.
*
* Note: This method should not be used when running to IBM i 6.1 or earlier releases.
*
* @param expirationInterval The number of days from today until the user profile is automatically disabled. Valid
* values range from 1 through 366. To specify that the user profile has no expiration
* interval, call {@link #setUserExpirationDate setUserExpirationDate(null)}.
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @throws RequestNotSupportedException If the request is not supported.
* @see #getUserExpirationInterval
* @see #setUserExpirationDate
**/
public void setUserExpirationInterval(int expirationInterval)
throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, RequestNotSupportedException
{
if (system_.getVRM() < 0x00070100)
{
String currentRelease = system_.getVersion() + "." + system_.getRelease();
throw new RequestNotSupportedException(currentRelease, RequestNotSupportedException.SYSTEM_LEVEL_NOT_CORRECT);
}
if (expirationInterval < 1 || expirationInterval > 366)
throw new ExtendedIllegalArgumentException("expirationInterval (" + expirationInterval + ")", ExtendedIllegalArgumentException.RANGE_NOT_VALID);
runCommand("USREXPITV(" + expirationInterval + ") USREXPDATE(*USREXPITV)");
}
/**
* Sets the user ID number (uid number) for this user profile. The uid number is used to identify the user when the
* user is using the directory file system. The uid number for a user cannot be changed if there are one or more
* active jobs for the user.
*
* @param userID The uid number to be assigned to the user profile. A value from 1 to 4294967294 can be entered. The
* uid number assigned must not already be assigned to another user profile.
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getUserID
**/
public void setUserID(long userID) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
runCommand("UID(" + Long.toString(userID) + ")");
}
/**
* Sets the level of help information detail to be shown and the function of the Page Up and Page Down keys by
* default. The system shows several displays that are suitable for the inexperienced user. More experienced users
* must perform an extra action to see detailed information. When values are specified for this parameter, the
* system presents detailed information without further action by the experienced user.
*
* @param userOptions The level of help information detail to be shown and the function of the Page Up and Page Down
* keys by default. Possible values include:
*
* - {@link #NONE NONE} - Detailed information is not shown.
*
- "*CLKWD" - Parameter keywords are shown instead of the possible parameter values when a
* control language (CL) command is prompted.
*
- "*EXPERT" - More detailed information is shown when the user is performing display and
* edit options to define or change the system (such as edit or display object authority).
*
- "*ROLLKEY" - The actions of the Page Up and Page Down keys are reversed.
*
- "*NOSTSMSG" - Status messages are not displayed when sent to the user.
*
- "*STSMSG" - Status messages are displayed when sent to the user.
*
- "*HLPFULL" - Help text is shown on a full display rather than in a window.
*
- "*PRTMSG" - A message is sent to this user's message queue when a spooled file for this
* user is printed or held by the printer writer.
*
* @throws AS400SecurityException If a security or authority error occurs.
* @throws ErrorCompletingRequestException If an error occurs before the request is completed.
* @throws InterruptedException If this thread is interrupted.
* @throws IOException If an error occurs while communicating with the system.
* @see #getUserOptions
**/
public void setUserOptions(String[] userOptions) throws AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException
{
if (userOptions == null)
{
Trace.log(Trace.ERROR, "Parameter 'userOptions' is null.");
throw new NullPointerException("userOptions");
}
runCommand("USROPT(" + setArrayToString(userOptions) + ")");
}
/**
* Sets the string representation of this User object.
*
* @return The user profile name.
**/
public String toString() {
return super.toString() + "[" + name_ + "]";
}
}