All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.com.ibm.as400.access.ObjectDescription Maven / Gradle / Ivy

The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename:  ObjectDescription.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.
//
///////////////////////////////////////////////////////////////////////////////
// Changes: 
// @A1 - 07/09/2007 - Change exists() to handle CPF9811
//
///////////////////////////////////////////////////////////////////////////////


package com.ibm.as400.access;

import java.beans.*;
import java.io.*;
import java.util.*;

/**
 * Represents a system QSYS object and its attributes.
 * ObjectDescription objects can be constructed individually, or generated
 * from an {@link ObjectList ObjectList}. An object's
 * attributes can be retrieved by calling {@link #getValue getValue()} and
 * passing one of the integer attribute constants defined in this class.
 * 

* Note: This class is not intended for use with database file members (type *MBR). * To retrieve attributes of file members, use {@link MemberDescription MemberDescription}. *

* Performance hint: * If you anticipate retrieving multiple attributes for a given QSYS object, * first call {@link #refresh refresh()}, which will make a single API call * to retrieve (and cache) all of the object's attribute values. *

* Implementation note: * This class internally uses the Retrieve Object Description (QUSROBJD) and * List Object Locks (QWCLOBJL) APIs. * * @see ObjectList * @see MemberDescription **/ public class ObjectDescription { private static final String USERSPACE_NAME = "JT4WCLOBJLQTEMP "; // New for QWCLOBJL API private static final String USERSPACE_PATH = "/QSYS.LIB/QTEMP.LIB/JT4WCLOBJL.USRSPC"; // New for QWCLOBJL API private static final String FORMAT_NAME = "OBJL0100"; // New for QWCLOBJL API private final static ProgramParameter errorCode_ = new ProgramParameter(new byte[4]); // New for QWCLOBJL API /** * Object attribute representing whether the object can be * changed by the Change Object Description (QLICOBJD) API. *

Type: {@link java.lang.Boolean Boolean} **/ public static final int ALLOW_CHANGE_BY_PROGRAM = 308; /** * Object attribute representing the identifier of the * authorized program analysis report (APAR) that caused * this object to be replaced. This field is null if * the object did not change because of an APAR. *

Type: {@link java.lang.String String} **/ public static final int APAR = 413; /** * Constant indicating that the auxiliary storage pools that are currently * part of the the thread's library name space will be searched to locate * the library. This includes the system ASP (ASP 1), all defined basic * user ASPs (ASPs 2-32), and, if the thread has an ASP group, the primary * and secondary ASPs in the thread's ASP group. */ public static final String ASP_NAME_ALL = "*"; // @550A /** * Constant indicating that the system ASP (ASP 1) and all defined basic user ASPs (ASPs 2-32) * will be searched to locate the library. No primary or secondary ASPs will be * searched, even if the thread has an ASP group. */ public static final String ASP_NAME_SYSBAS = "*SYSBAS"; // @550A /** * Constant indicating that if the thread has an ASP group, the primary and secondary ASPs * in the ASP group will be searched to locate the library. The system ASP (ASP 1) and * defined basic user ASPs (ASPs 2-32) will not be searched. */ public static final String ASP_NAME_CURASPGRP = "*CURASPGRP"; // @550A /** * Constant indicating that all available ASPs will be searched. This includes the system * ASP (ASP 1), all defined basic user ASPs (ASPs 2-32), and all available primary and * secondary ASPs (ASPs 33-255 with a status of 'Available'). The ASP groups are searched * in alphabetical order by the primary ASP. The system ASP and all defined basic user * ASPs are searched after the ASP groups. ASPs and libraries to which the user is not authorized * are bypassed and no authority error messages are sent. The search ends when the first object * is found of the specified object name, library name, and object type. If the user is * not authorized to the object, an authority error message is sent. */ public static final String ASP_NAME_ALLAVL = "*ALLAVL"; // @550A /** * Constant indicating that the name of the auxiliary storage pool * device is not known. * @see #LIBRARY_ASP_DEVICE_NAME * @see #OBJECT_ASP_DEVICE_NAME **/ public static final String ASP_NAME_UNKNOWN = "*N"; /** * Constant indicating that only the single ASP named in the auxiliary storage * pool device name field will be searched. */ public static final String ASP_SEARCH_TYPE_ASP = "*ASP"; // @550A /** * Constant indicating that all ASPs in the auxiliary storage pool group named * in the auxiliary storage pool device name field will be searched. The device * name must be the name of the primary auxiliary storage pool in the group. */ public static final String ASP_SEARCH_TYPE_ASPGRP = "*ASPGRP"; // @550A /** * Object attribute representing the type of auditing for the object. * Valid values are: *

    *
  • {@link #AUDITING_NONE AUDITING_NONE} - No auditing occurs for * the object when it is read or changed, regardless of the user * who is accessing the object. *
  • {@link #AUDITING_USER_PROFILE AUDITING_USER_PROFILE} - Audit the * object only if the user accessing the object is being audited. *
  • {@link #AUDITING_CHANGE AUDITING_CHANGE} - Audit all * change access to this object by all users on the system. *
  • {@link #AUDITING_ALL AUDITING_ALL} - Audit all access to the object * by all users on the system. All access is defined as a read or * change operation. *
*

Type: {@link java.lang.String String} **/ public static final int AUDITING = 310; /** * Constant representing the auditing value *ALL. * @see #AUDITING **/ public static final String AUDITING_ALL = "*ALL"; /** * Constant representing the auditing value *CHANGE. * @see #AUDITING **/ public static final String AUDITING_CHANGE = "*CHANGE"; /** * Constant representing the auditing value *NONE. * @see #AUDITING **/ public static final String AUDITING_NONE = "*NONE"; /** * Constant representing the auditing value *USRPRF. * @see #AUDITING **/ public static final String AUDITING_USER_PROFILE = "*USRPRF"; /** * Object attribute representing the time at which * the object was last changed. *

Type: {@link java.util.Date java.util.Date} **/ public static final int CHANGE_DATE = 305; /** * Object attribute representing whether the object has been * changed by the Change Object Description (QLICOBJD) API. *

Type: {@link java.lang.Boolean Boolean} **/ public static final int CHANGED_BY_PROGRAM = 309; // We dont' use these, but there's nothing to prevent the user // from manually entering an integer attribute equal to one of // these values. static final int COMBINATION_200 = 200; static final int COMBINATION_300 = 300; static final int COMBINATION_400 = 400; static final int COMBINATION_500 = 500; static final int COMBINATION_600 = 600; static final int COMBINATION_700 = 700; /** * Object attribute representing the licensed program * of the compiler used to generate this object. * The field will be null if the program was not compiled. *

Type: {@link Product Product} **/ public static final int COMPILER = 408; /** * Object attribute representing the compression status of * the object. Valid values are: *

    *
  • {@link #COMPRESSION_YES COMPRESSION_YES} - Compressed. *
  • {@link #COMPRESSION_NO COMPRESSION_NO} - Permanently decompressed * and compressible. *
  • {@link #COMPRESSION_INELIGIBLE COMPRESSION_INELIGIBLE} - Permanently * decompressed and not compressible. *
  • {@link #COMPRESSION_TEMPORARY COMPRESSION_TEMPORARY} - Temporarily * decompressed. *
  • {@link #COMPRESSION_STORAGE_FREED COMPRESSION_STORAGE_FREED} - Saved with * storage freed. The compression status cannot be determined. *
*

Type: {@link java.lang.String String} **/ public static final int COMPRESSION = 307; /** * Constant representing the compression status "X". * @see #COMPRESSION **/ public static final String COMPRESSION_INELIGIBLE = "X"; /** * Constant representing the compression status "N". * @see #COMPRESSION **/ public static final String COMPRESSION_NO = "N"; /** * Constant representing the compression status "F". * @see #COMPRESSION **/ public static final String COMPRESSION_STORAGE_FREED = "F"; /** * Constant representing the compression status "T". * @see #COMPRESSION **/ public static final String COMPRESSION_TEMPORARY = "T"; /** * Constant representing the compression status "Y". * @see #COMPRESSION **/ public static final String COMPRESSION_YES = "Y"; /** * Object attribute representing the time at which the * object was created. *

Type: {@link java.util.Date java.util.Date} **/ public static final int CREATION_DATE = 304; /** * Object attribute representing the name of the system on * which the object was created. *

Type: {@link java.lang.String String} **/ public static final int CREATOR_SYSTEM = 406; /** * Object attribute representing the name of the user * that created the object. *

Type: {@link java.lang.String String} **/ public static final int CREATOR_USER_PROFILE = 405; /** * Constant representing the value *CURLIB. **/ public static final String CURRENT_LIBRARY = "*CURLIB"; /** * Object attribute representing the number of days the * object was used, or 0 if the object does not have * a last-used date. *

Type: {@link java.lang.Integer Integer} * @see #LAST_USED_DATE **/ public static final int DAYS_USED = 603; /** * Object attribute representing whether the object * has a digital signature. *

Type: {@link java.lang.Boolean Boolean} * @see #DIGITALLY_SIGNED_TRUSTED * @see #DIGITALLY_SIGNED_MULTIPLE **/ public static final int DIGITALLY_SIGNED = 311; /** * Object attribute representing whether the object has * more than one digital signature. *

Type: {@link java.lang.Boolean Boolean} * @see #DIGITALLY_SIGNED * @see #DIGITALLY_SIGNED_TRUSTED **/ public static final int DIGITALLY_SIGNED_MULTIPLE = 313; /** * Object attribute representing whether the object * is signed by a source that is trusted by the system. *

Type: {@link java.lang.Boolean Boolean} * @see #DIGITALLY_SIGNED * @see #DIGITALLY_SIGNED_MULTIPLE **/ public static final int DIGITALLY_SIGNED_TRUSTED = 312; /** * Object attribute representing the domain that contains * the object. Valid values are: *

    *
  • {@link #DOMAIN_USER DOMAIN_USER} - The object is in the user domain. *
  • {@link #DOMAIN_SYSTEM DOMAIN_SYSTEM} - The object is in the system domain. *
*

Type: {@link java.lang.String String} **/ public static final int DOMAIN = 303; /** * Constant representing the object domain value of "*S". * @see #DOMAIN **/ public static final String DOMAIN_SYSTEM = "*S"; /** * Constant representing the object domain value of "*U". * @see #DOMAIN **/ public static final String DOMAIN_USER = "*U"; /** * Object attribute representing the extended attribute * that further describes the object, such as a program or file type. * For example, an object type of *PGM may have a value * of RPG (RPG program) or CLP (CL program); an object type * of *FILE may have a value of PF (physical file), LF * (logical file), DSPF (display file), SAVF (save file), and * so on. *

Type: {@link java.lang.String String} **/ public static final int EXTENDED_ATTRIBUTE = 202; // We don't use this, as it is only valid when retrieving attributes // via ObjectList. Use getStatus() instead. static final int INFORMATION_STATUS = 201; /** * Object attribute representing whether the object is * currently being journaled or not. *

Type: {@link java.lang.Boolean Boolean} **/ public static final int JOURNAL_STATUS = 513; /** * Object attribute representing the fully-qualified integrated * file system path name of the journal. This field is blank if the object * has never been journaled. *

Type: {@link java.lang.String String} **/ public static final int JOURNAL = 514; static final int JOURNAL_LIBRARY = 515; /** * Object attribute representing the type of images that are * written to the journal receiver for updates to the object. * This field is true if both before and after images are * generated for changes to the object. * This field is false if only after images are generated * for changes to the object, or, if the object has never * been journaled. *

Type: {@link java.lang.Boolean Boolean} **/ public static final int JOURNAL_IMAGES = 516; /** * Object attribute representing whether journal entries * to be omitted are journaled. * This field is true if no * entries are omitted; that is, all entries are journaled * including open and close entries that would normally be * omitted. * This field is false if * open and close operations do not generate open and close * journal entries, or, if this object has never been journaled. *

Type: {@link java.lang.Boolean Boolean} **/ public static final int JOURNAL_OMITTED_ENTRIES = 517; /** * Object attribute representing the time at which journaling * for the object was last started. This field will contain * Date value of 0 ms if the object has never been journaled. *

Type: {@link java.util.Date java.util.Date} **/ public static final int JOURNAL_START_DATE = 518; /** * Object attribute representing the time at which the * object was last used. This field will contain a Date * value of 0 ms if the object has no last-used date. *

Type: {@link java.util.Date java.util.Date} **/ public static final int LAST_USED_DATE = 601; /** * Object attribute representing the library of the object. *

Type: {@link java.lang.String String} * @see #getLibrary **/ public static final int LIBRARY = 10001; /** * Object attribute representing the name of the auxiliary * storage pool (ASP) device where storage is allocated * for the library containing the object. Special values * include: *

    *
  • {@link #SYSTEM_OR_BASIC_ASP SYSTEM_OR_BASIC_ASP} - System * ASP (1) or defined basic user ASPs (2-32). *
  • {@link #ASP_NAME_UNKNOWN ASP_NAME_UNKNOWN} - The name of * the ASP device cannot be determined. *
*

Type: {@link java.lang.String String} * @see #LIBRARY_ASP_NUMBER * @see #OBJECT_ASP_NUMBER * @see #OBJECT_ASP_DEVICE_NAME **/ public static final int LIBRARY_ASP_DEVICE_NAME = 606; /** * Object attribute representing the number of the auxiliary * storage pool (ASP) where storage is allocated for the library * containing the object. Valid values are: *

    *
  • 1: System ASP *
  • 2-32: Basic user ASP *
  • 33-255: Primary or secondary ASP *
*

Type: {@link java.lang.Integer Integer} * @see #LIBRARY_ASP_DEVICE_NAME * @see #OBJECT_ASP_NUMBER * @see #OBJECT_ASP_DEVICE_NAME **/ public static final int LIBRARY_ASP_NUMBER = 314; /** * Constant representing the value *LIBL. **/ public static final String LIBRARY_LIST = "*LIBL"; /** * Object attribute representing the licensed program of the object. * This field is null if the object does not belong to a licensed * program. *

Type: {@link Product Product} **/ public static final int LICENSED_PROGRAM = 411; /** * Object attribute representing the name of the object. *

Type: {@link java.lang.String String} * @see #getName **/ public static final int NAME = 10000; /** * Object attribute representing the name of the auxiliary * storage pool (ASP) device where storage is allocated * for the object. Special values include: *

    *
  • {@link #SYSTEM_OR_BASIC_ASP SYSTEM_OR_BASIC_ASP} - System * ASP (1) or defined basic user ASPs (2-32). *
  • {@link #ASP_NAME_UNKNOWN ASP_NAME_UNKNOWN} - The name of * the ASP device cannot be determined. *
*

Type: {@link java.lang.String String} * @see #OBJECT_ASP_NUMBER * @see #LIBRARY_ASP_DEVICE_NAME * @see #LIBRARY_ASP_NUMBER **/ public static final int OBJECT_ASP_DEVICE_NAME = 605; /** * Object attribute representing the number of the auxiliary * storage pool (ASP) where storage is allocated for the object. * Valid values are: *

    *
  • 1: System ASP *
  • 2-32: Basic user ASP *
  • 33-255: Primary or secondary ASP *
*

Type: {@link java.lang.Integer Integer} * @see #OBJECT_ASP_DEVICE_NAME * @see #LIBRARY_ASP_DEVICE_NAME * @see #LIBRARY_ASP_NUMBER **/ public static final int OBJECT_ASP_NUMBER = 301; /** * Object attribute representing the object control level * for the created object. *

Type: {@link java.lang.String String} **/ public static final int OBJECT_LEVEL = 409; /** * Object attribute representing the size of the object * in bytes. *

Type: {@link java.lang.Long Long} **/ public static final int OBJECT_SIZE = 701; static final int OBJECT_SIZE_MULTIPLIER = 702; /** * Object attribute representing the order in which the library * appears in the entire library list. If the library is in the * list more than once, the order of the first occurrence of * the library is returned. If the library is not in the library * list, 0 is returned. *

Note that this field can only be retrieved via the ObjectList * class. If {@link #getValue getValue()} is called and this field was not retrieved * via an ObjectList, -1 is returned. *

Type: {@link java.lang.Integer Integer} **/ public static final int ORDER_IN_LIBRARY_LIST = 205; // ObjectList only /** * Object attribute representing whether the object overflowed * the auxiliary storage pool (ASP). * Note that it is not possible for objects that reside in the system ASP, * a primary ASP, or a secondary ASP to overflow the ASP. *

Type: {@link java.lang.Boolean Boolean} **/ public static final int OVERFLOWED_ASP = 703; /** * Object attribute representing the name of the object * owner's user profile. *

Type: {@link java.lang.String String} **/ public static final int OWNER = 302; /** * Object attribute representing the name of the primary group profile * for the object. Special values include: *

    *
  • {@link #PRIMARY_GROUP_NONE PRIMARY_GROUP_NONE} - No primary group * exists for the object. *
*

Type: {@link java.lang.String String} **/ public static final int PRIMARY_GROUP = 414; /** * Constant representing a primary group of *NONE. * @see #PRIMARY_GROUP **/ public static final String PRIMARY_GROUP_NONE = "*NONE"; /** * Object attribute representing the number of the program temporary * fix (PTF) number that caused this object to be replaced. This field * is blank if the object was not changed because of a PTF. *

Type: {@link java.lang.String String} **/ public static final int PTF = 412; /** * Object attribute representing the time the days-used count * was last reset to 0. If the days-used count has never been * reset, this field contains a Date value of 0 ms. *

Type: {@link java.util.Date java.util.Date} * @see #DAYS_USED **/ public static final int RESET_DATE = 602; /** * Object attribute representing the time at which the * object was restored. This field will contain a Date * value of 0 ms if the object has never been restored. *

Type: {@link java.util.Date java.util.Date} **/ public static final int RESTORE_DATE = 502; /** * Object attribute representing the time the object was last * saved when the SAVACT(*LIB, *SYSDFN, or *YES) save * operation was specified. If the object has never been saved, * or if SAVACT(*NO) was specified on the last save operation for * the object, this field contains a Date value of 0 ms. *

Type: {@link java.util.Date java.util.Date} **/ public static final int SAVE_ACTIVE_DATE = 512; /** * Object attribute representing the command used to save * the object. This field is blank if the object was not saved. *

Type: {@link java.lang.String String} **/ public static final int SAVE_COMMAND = 506; /** * Object attribute representing the time at which the * object was saved. This field will contain a Date * value of 0 ms if the object has never been saved. *

Type: {@link java.util.Date java.util.Date} **/ public static final int SAVE_DATE = 501; /** * Object attribute representing the type of device to which the * object was last saved. Possible values are: *

    *
  • {@link #SAVE_DEVICE_SAVE_FILE SAVE_DEVICE_SAVE_FILE} - The last save * operation was to a save file. *
  • {@link #SAVE_DEVICE_DISKETTE SAVE_DEVICE_DISKETTE} - The last save * operation was to diskette. *
  • {@link #SAVE_DEVICE_TAPE SAVE_DEVICE_TAPE} - The last save * operation was to tape. *
  • {@link #SAVE_DEVICE_OPTICAL SAVE_DEVICE_OPTICAL} - The last save * operation was to optical. *
  • {@link #SAVE_DEVICE_NOT_SAVED SAVE_DEVICE_NOT_SAVED} - The object * was not saved. *
*

Type: {@link java.lang.String String} **/ public static final int SAVE_DEVICE = 508; /** * Constant representing a save device of *DKT. * @see #SAVE_DEVICE **/ public static final String SAVE_DEVICE_DISKETTE = "*DKT"; /** * Constant representing no save device (blank). * @see #SAVE_DEVICE **/ public static final String SAVE_DEVICE_NOT_SAVED = ""; /** * Constant representing a save device of *OPT. * @see #SAVE_DEVICE **/ public static final String SAVE_DEVICE_OPTICAL = "*OPT"; /** * Constant representing a save device of *SAVF. * @see #SAVE_DEVICE **/ public static final String SAVE_DEVICE_SAVE_FILE = "*SAVF"; /** * Constant representing a save device of *TAP. * @see #SAVE_DEVICE **/ public static final String SAVE_DEVICE_TAPE = "*TAP"; /** * Object attribute representing the fully-qualified integrated file * system path name of the save file to which the object was saved. * This field is blank if the object was not saved to a save file. *

Type: {@link java.lang.String String} **/ public static final int SAVE_FILE = 509; static final int SAVE_FILE_LIBRARY = 510; /** * Object attribute representing the file label used when the object * was saved. This field is blank if the object was not saved to tape, * diskette, or optical. This field corresponds to the LABEL parameter * on the command used to save the object. *

Type: {@link java.lang.String String} **/ public static final int SAVE_LABEL = 511; /** * Object attribute representing the tape sequence number * assigned when the object was saved on tape, or 0 * if the object was not saved. *

Type: {@link java.lang.Integer Integer} **/ public static final int SAVE_SEQUENCE_NUMBER = 505; /** * Object attribute representing the size of the object in * bytes of storage at the time of the last save operation, * or 0 if the object was not saved. *

Type: {@link java.lang.Long Long} **/ public static final int SAVE_SIZE = 503; static final int SAVE_SIZE_MULTIPLIER = 504; /** * Object attribute representing the tape, diskette, or optical * volumes that are used for saving the object. This field returns * a maximum of ten 6-character volumes. Each volume is separated * by a single character. *

* If the object was saved in parallel format, the separator character * contains a 2 before the first volume in the second media file, a 3 * before the third media file, and so on, up to a 0 before the tenth * media file. Otherwise, the separator characters are blank. If more * than ten volumes are used and the object was saved in serial format, * 1 is returned in the 71st character of this field. *

* The field is blank if the object was last saved to a save file or * if it was never saved. *

Type: {@link java.lang.String String} **/ public static final int SAVE_VOLUME_ID = 507; /** * Object attribute representing the fully-qualified integrated * file system path name of the source file that was used to * create the object. This field is blank if no source file was * used to create the object. *

Type: {@link java.lang.String String} **/ public static final int SOURCE_FILE = 401; static final int SOURCE_FILE_LIBRARY = 402; static final int SOURCE_FILE_MEMBER = 403; /** * Object attribute representing the time the member in the source * file was last updated. This field is null if no source file * created the object. *

Type: {@link java.util.Date java.util.Date} * @see #SOURCE_FILE **/ public static final int SOURCE_FILE_UPDATED_DATE = 404; /** * Constant representing a status of 'D' for the information in this * object when generated by an ObjectList. * @see #getStatus **/ public static final byte STATUS_DAMAGED = (byte)0xC4; // EBCDIC 'D' /** * Constant representing a status of 'L' for the information in this * object when generated by an ObjectList. * @see #getStatus **/ public static final byte STATUS_LOCKED = (byte)0xD3; // EBCDIC 'L' /** * Constant representing a status of 'A' for the information in this * object when generated by an ObjectList. * @see #getStatus **/ public static final byte STATUS_NO_AUTHORITY = (byte)0xC1; // EBCDIC 'A' /** * Constant representing a status of ' ' for the information in this * object when generated by an ObjectList. * @see #getStatus **/ public static final byte STATUS_NO_ERRORS = (byte)0x40; // EBCDIC ' ' /** * Constant representing a status of 'P' for the information in this * object when generated by an ObjectList. * @see #getStatus **/ public static final byte STATUS_PARTIALLY_DAMAGED = (byte)0xD7; // EBCDIC 'P' /** * Constant representing an unknown status for the information in this * object. * @see #getStatus **/ public static final byte STATUS_UNKNOWN = (byte)0x00; // We didn't retrieve any attributes. /** * Object attribute representing the storage status of the object. * Possible values are: *

    *
  • {@link #STORAGE_STATUS_FREE STORAGE_STATUS_FREE} - Indicates * the object data is freed and the object is suspended. *
  • {@link #STORAGE_STATUS_KEEP STORAGE_STATUS_KEEP} - Indicates * the object data is not freed and the object is not suspended. *
*

Type: {@link java.lang.String String} **/ public static final int STORAGE_STATUS = 306; /** * Constant representing a storage status of *FREE. * @see #STORAGE_STATUS **/ public static final String STORAGE_STATUS_FREE = "*FREE"; /** * Constant representing a storage status of *FREE. * @see #STORAGE_STATUS **/ public static final String STORAGE_STATUS_KEEP = "*KEEP"; /** * Object attribute representing the level of the operating system * when the object was created. This field has the format VvvRrrMmm * where: *

    *
  • Vvv - The character 'V' followed by a 2-character version number. *
  • Rrr - The character 'R' followed by a 2-character release level. *
  • Mmm - The character 'M' followed by a 2-character modification level. *
*

Type: {@link java.lang.String String} **/ public static final int SYSTEM_LEVEL = 407; /** * Constant indicating that the auxiliary storage pool device * is the system ASP or a defined basic user ASP. * @see #LIBRARY_ASP_DEVICE_NAME * @see #OBJECT_ASP_DEVICE_NAME **/ public static final String SYSTEM_OR_BASIC_ASP = "*SYSBAS"; /** * Object attribute representing the text description of the object. * This field is blank if no text description is specified. *

Type: {@link java.lang.String String} **/ public static final int TEXT_DESCRIPTION = 203; /** * Object attribute representing the type of the object. *

Type: {@link java.lang.String String} * @see #getType **/ public static final int TYPE = 10002; /** * Object attribute representing whether the object usage * information is updated for this object type. *

Type: {@link java.lang.Boolean Boolean} **/ public static final int USAGE_INFO_UPDATED = 604; /** * Object attribute representing whether the user program was changed. * This field is true if the user changed the object; false if the object * was not changed by the user. *

Type: {@link java.lang.Boolean Boolean} **/ public static final int USER_CHANGED = 410; /** * Object attribute representing the characteristic of the object * type. This field is set by the user while using the Change Object * Description (QLICOBJD) API. *

Type: {@link java.lang.String String} **/ public static final int USER_DEFINED_ATTRIBUTE = 204; // Holds the lengths for all of the keys. static final IntegerHashtable keyLengths_ = new IntegerHashtable(); static { keyLengths_.put(COMBINATION_200, 80); keyLengths_.put(INFORMATION_STATUS, 1); keyLengths_.put(EXTENDED_ATTRIBUTE, 10); keyLengths_.put(TEXT_DESCRIPTION, 50); keyLengths_.put(USER_DEFINED_ATTRIBUTE, 10); keyLengths_.put(ORDER_IN_LIBRARY_LIST, 4); keyLengths_.put(COMBINATION_300, 144); keyLengths_.put(OBJECT_ASP_NUMBER, 4); keyLengths_.put(OWNER, 10); keyLengths_.put(DOMAIN, 2); keyLengths_.put(CREATION_DATE, 8); keyLengths_.put(CHANGE_DATE, 8); keyLengths_.put(STORAGE_STATUS, 10); keyLengths_.put(COMPRESSION, 1); keyLengths_.put(ALLOW_CHANGE_BY_PROGRAM, 1); keyLengths_.put(CHANGED_BY_PROGRAM, 1); keyLengths_.put(AUDITING, 10); keyLengths_.put(DIGITALLY_SIGNED, 1); keyLengths_.put(DIGITALLY_SIGNED_TRUSTED, 1); keyLengths_.put(DIGITALLY_SIGNED_MULTIPLE, 1); keyLengths_.put(LIBRARY_ASP_NUMBER, 4); keyLengths_.put(COMBINATION_400, 296); keyLengths_.put(SOURCE_FILE, 10); keyLengths_.put(SOURCE_FILE_LIBRARY, 10); keyLengths_.put(SOURCE_FILE_MEMBER, 10); keyLengths_.put(SOURCE_FILE_UPDATED_DATE, 13); keyLengths_.put(CREATOR_USER_PROFILE, 10); keyLengths_.put(CREATOR_SYSTEM, 8); keyLengths_.put(SYSTEM_LEVEL, 9); keyLengths_.put(COMPILER, 16); keyLengths_.put(OBJECT_LEVEL, 8); keyLengths_.put(USER_CHANGED, 1); keyLengths_.put(LICENSED_PROGRAM, 16); keyLengths_.put(PTF, 10); keyLengths_.put(APAR, 10); keyLengths_.put(PRIMARY_GROUP, 10); keyLengths_.put(COMBINATION_500, 504); keyLengths_.put(SAVE_DATE, 8); keyLengths_.put(RESTORE_DATE, 8); keyLengths_.put(SAVE_SIZE, 4); keyLengths_.put(SAVE_SIZE_MULTIPLIER, 4); keyLengths_.put(SAVE_SEQUENCE_NUMBER, 4); keyLengths_.put(SAVE_COMMAND, 10); keyLengths_.put(SAVE_VOLUME_ID, 71); keyLengths_.put(SAVE_DEVICE, 10); keyLengths_.put(SAVE_FILE, 10); keyLengths_.put(SAVE_FILE_LIBRARY, 10); keyLengths_.put(SAVE_LABEL, 17); keyLengths_.put(SAVE_ACTIVE_DATE, 8); keyLengths_.put(JOURNAL_STATUS, 1); keyLengths_.put(JOURNAL, 10); keyLengths_.put(JOURNAL_LIBRARY, 10); keyLengths_.put(JOURNAL_IMAGES, 1); keyLengths_.put(JOURNAL_OMITTED_ENTRIES, 1); keyLengths_.put(JOURNAL_START_DATE, 8); keyLengths_.put(COMBINATION_600, 548); keyLengths_.put(LAST_USED_DATE, 8); keyLengths_.put(RESET_DATE, 8); keyLengths_.put(DAYS_USED, 4); keyLengths_.put(USAGE_INFO_UPDATED, 1); keyLengths_.put(OBJECT_ASP_DEVICE_NAME, 10); keyLengths_.put(LIBRARY_ASP_DEVICE_NAME, 10); keyLengths_.put(COMBINATION_700, 560); keyLengths_.put(OBJECT_SIZE, 4); keyLengths_.put(OBJECT_SIZE_MULTIPLIER, 4); keyLengths_.put(OVERFLOWED_ASP, 1); } private AS400 system_; private QSYSObjectPathName path_; private String aspSearchType_ = ASP_SEARCH_TYPE_ASP; // @550A private byte status_; private transient AS400Timestamp timestampConverter_; private final JobHashtable values_ = new JobHashtable(); /** * Constructs an ObjectDescription given the specified path to the object. * @param system The system. * @param path The fully-qualified integrated file system path to the object. * Special values for the library portion of the path include %CURLIB% and * %LIBL%. Only external object types are allowed for the object type. * Consider using {@link QSYSObjectPathName QSYSObjectPathName} to compose * the fully-qualified path string, * or using {@link #ObjectDescription(AS400,QSYSObjectPathName) ObjectDescription(AS400,QSYSObjectPathName)} instead. **/ public ObjectDescription(AS400 system, String path) { this(system, new QSYSObjectPathName(path)); } /** * Constructs an ObjectDescription given the specified path to the object. * @param system The system. * @param path The fully-qualified integrated file system path to the object. **/ public ObjectDescription(AS400 system, QSYSObjectPathName path) { if (system == null) throw new NullPointerException("system"); if (path == null) throw new NullPointerException("path"); system_ = system; path_ = path; } /** * Constructs an ObjectDescription given the object's library, name, and type. * @param system The system. * @param objectLibrary The library. Special values include: *

    *
  • {@link #CURRENT_LIBRARY CURRENT_LIBRARY} - The current library is searched for the object. *
  • {@link #LIBRARY_LIST LIBRARY_LIST} - The library list is searched for the object. *
* @param objectName The name of the object. Wildcards are not allowed. * @param objectType The type of the object, e.g. "FILE". Only external object types are allowed. **/ public ObjectDescription(AS400 system, String objectLibrary, String objectName, String objectType) { if (system == null) throw new NullPointerException("system"); if (objectLibrary == null) throw new NullPointerException("library"); if (objectName == null) throw new NullPointerException("name"); if (objectType == null) throw new NullPointerException("type"); system_ = system; path_ = new QSYSObjectPathName(objectLibrary, objectName, objectType); // Verify valid values. } // @550A /** * Constructs an ObjectDescription given the object's library, name, and type. * @param system The system. * @param objectLibrary The library. Special values include: *
    *
  • {@link #CURRENT_LIBRARY CURRENT_LIBRARY} - The current library is searched for the object. *
  • {@link #LIBRARY_LIST LIBRARY_LIST} - The library list is searched for the object. *
* @param objectName The name of the object. Wildcards are not allowed. * @param objectType The type of the object, e.g. "FILE". Only external object types are allowed. * @param aspDeviceName The name of an auxiliary storage pool (ASP) device in which storage is * allocated for the library that contains the object or one of the following special values: *
    *
  • {@link #ASP_NAME_ALL ASP_NAME_ALL} - The ASPs in the thread's library name space.
  • *
  • {@link #ASP_NAME_ALLAVL ASP_NAME_ALLAVL} - The system ASP (ASP 1) and defined basic user ASPs (ASPs 2-32).
  • *
  • {@link #ASP_NAME_CURASPGRP ASP_NAME_CURASPGRP} - The ASPs in the current thread's ASP group.
  • *
  • {@link #ASP_NAME_SYSBAS ASP_NAME_SYSBAS} - All available ASPs.
  • *
**/ public ObjectDescription(AS400 system, String objectLibrary, String objectName, String objectType, String aspDeviceName) { if (system == null) throw new NullPointerException("system"); if (objectLibrary == null) throw new NullPointerException("library"); if (objectName == null) throw new NullPointerException("name"); if (objectType == null) throw new NullPointerException("type"); system_ = system; path_ = new QSYSObjectPathName(objectLibrary, objectName, objectType); // Verify valid values. if (aspDeviceName != null && aspDeviceName.length() != 0) { try { path_.setAspName(aspDeviceName); } catch (PropertyVetoException e) {} // can't happen } } /** * Package scope constructor used by ObjectList. **/ ObjectDescription(AS400 sys, String lib, String name, String type, byte status) { system_ = sys; path_ = new QSYSObjectPathName(lib, name, type); // Verify valid values. status_ = status; } // @550A /** * Package scope constructor used by ObjectList. **/ ObjectDescription(AS400 sys, String lib, String name, String type, byte status, String aspDeviceName, String aspSearchType) { system_ = sys; path_ = new QSYSObjectPathName(lib, name, type); // Verify valid values. status_ = status; if (aspDeviceName != null && aspDeviceName.length() != 0) { try { path_.setAspName(aspDeviceName); } catch (PropertyVetoException e) {} // can't happen } aspSearchType_ = aspSearchType; } /** * Indicates whether some other object is "equal to" this one. * @param obj The reference object with which to compare. * @return true if this object is the same as the obj argument; false otherwise. **/ public boolean equals(Object obj) { try { if (obj == null) return false; ObjectDescription otherObj = (ObjectDescription)obj; if (!otherObj.getSystem().getSystemName().equals(system_.getSystemName())) return false; if (!otherObj.getLibrary().equals(getLibrary())) return false; if (!otherObj.getName().equals(getName())) return false; if (!otherObj.getType().equals(getType())) return false; return true; } catch (Exception e) { if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, e); return false; } } /** Returns a hash code value for the object. @return A hash code value for this object. **/ public int hashCode() { // We must conform to the invariant that equal objects must have equal hashcodes. int hash = system_.getSystemName().hashCode() + getLibrary().hashCode() + getName().hashCode() + getType().hashCode(); return hash; } /** * Checks to see if this object currently exists on the system. * @return true if the object exists; false if the object or library do not exist. * @throws AS400Exception If an error occurs. * @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. * @exception ObjectDoesNotExistException If the system API that retrieves object information is missing. **/ public boolean exists() throws AS400Exception, AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException { try { // Retrieve an arbitrary attribute that's a field in the 0100 (smallest) format. retrieve(DOMAIN); } catch(AS400Exception e) { String id = e.getAS400Message().getID().trim(); if (id.equalsIgnoreCase("CPF9801") || // Object &2 in library &3 not found. id.equalsIgnoreCase("CPF9810") || // Library &1 not found. id.equalsIgnoreCase("CPF9811") || // Program &1 in library &2 not found. @A1A id.equalsIgnoreCase("CPF9812") || // File &1 in library &2 not found. id.equalsIgnoreCase("CPF9814")) // Device &1 not found. { return false; } throw e; } return true; } /** * Helper method used to parse one of the attributes that are dates. **/ private final Date getDate(Object o) throws AS400Exception, AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException { if (o instanceof String) { String str = ((String)o).trim(); switch (str.length()) { case 7: Calendar c = AS400Calendar.getGregorianInstance(); c.clear(); c.set(Integer.parseInt(str.substring(0,3)) + 1900,// year Integer.parseInt(str.substring(3,5))-1, // month is zero based Integer.parseInt(str.substring(5,7))); // day return c.getTime(); case 13: c = AS400Calendar.getGregorianInstance(); c.clear(); c.set(Integer.parseInt(str.substring(0,3)) + 1900,// year Integer.parseInt(str.substring(3,5))-1, // month is zero based Integer.parseInt(str.substring(5,7)), // day Integer.parseInt(str.substring(7,9)), // hour Integer.parseInt(str.substring(9,11)), // minute Integer.parseInt(str.substring(11,13))); // second return c.getTime(); default: return null; } } else if (o instanceof byte[]) { byte[] b = (byte[])o; // system timestamp 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 // return conv.toDate(conv.toTimestamp(b), TimeZone.getDefault()); } return null; } /** * Returns the library of this object. * @return The object library. Never null. **/ public String getLibrary() { return path_.getLibraryName(); } /** * Returns the name of this object. * @return The object name. Never null. **/ public String getName() { return path_.getObjectName(); } //@550A /** * Returns the name of an auxiliary storage pool (ASP) device in which storage is * allocated for the library that contains the object. * @return The auxiliary storage pool (ASP) device name or null if no ASP device name has been set. */ public String getAspDeviceName() { return path_.getAspName(); } //@550A /** * Returns the type of search to be used withn a specific auxiliary storage pool * device name is specified. * @return The search type. */ public String getAspSearchType(){ return aspSearchType_; } /** * Returns the fully-qualified integrated file system path name of this object. * @return The object path name. Never null. **/ public String getPath() { return path_.getPath(); } /** * Returns the status of the information returned in this object * if it was generated by an {@link ObjectList ObjectList}. * @return The status. * Possible values are: *
    *
  • {@link #STATUS_NO_ERRORS STATUS_NO_ERRORS} - The requested * attribute information was returned. No errors occurred. *
  • {@link #STATUS_NO_AUTHORITY STATUS_NO_AUTHORITY} - No information * was returned because the job did not have the authority specified * in the object authorities field of the object. *
  • {@link #STATUS_DAMAGED STATUS_DAMAGED} - The requested attribute * information was returned, but the object is damaged and should be * recreated as soon as possible. *
  • {@link #STATUS_LOCKED STATUS_LOCKED} - No information was * returned because the object is locked. *
  • {@link #STATUS_PARTIALLY_DAMAGED STATUS_PARTIALLY_DAMAGED} - The * requested information was returned, but the object is partially * damaged. *
* If two or more conditions occur that include STATUS_NO_AUTHORITY, * the status is set to STATUS_NO_AUTHORITY. If the object is locked and either * damaged or partially damaged, the status is set to STATUS_LOCKED. *

If the status returned is either STATUS_NO_AUTHORITY or * STATUS_LOCKED, no attribute information will have been collected * by ObjectList, so any call to {@link #getValue getValue()} will result in another * call to the system, where an exception is likely to occur (because * of the lack of authority, for example). Only the object name, library, * and type are valid in this case. **/ public byte getStatus() { return status_; } /** * Returns the system. * @return The system. Never null. **/ public AS400 getSystem() { return system_; } 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_; } /** * Returns the type of this object. * @return The object type. Never null. **/ public String getType() { return path_.getObjectType(); } /** * Returns the value of the given attribute of this ObjectDescription. If the value is not found, * it is retrieved from the system. The values are cached. *

* Performance hint: If multiple attribute values are to be retrieved for a * single ObjectDescription, first call {@link #refresh refresh()} to retrieve * (and cache) all of the known attributes of this object from the system. * @param attribute One of the attribute constants. * @return The value for the attribute, or null if one was not found. * @throws AS400Exception If an error occurs. * @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. * @exception ObjectDoesNotExistException If the system API that retrieves object information is missing. **/ public Object getValue(int attribute) throws AS400Exception, AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException { switch (attribute) { case NAME: return getName(); case LIBRARY: return getLibrary(); case TYPE: return getType(); } Object o = values_.get(attribute); if (o == null) { if (attribute == ORDER_IN_LIBRARY_LIST) { // Can only retrieve this via ObjectList return new Integer(-1); } retrieve(attribute); o = values_.get(attribute); } try { switch (attribute) { case CREATION_DATE: case CHANGE_DATE: case SOURCE_FILE_UPDATED_DATE: case SAVE_DATE: case RESTORE_DATE: case RESET_DATE: case SAVE_ACTIVE_DATE: case JOURNAL_START_DATE: case LAST_USED_DATE: return getDate(o); case JOURNAL: String name = (String)o; if (name.length() > 0) { String lib = (String)getValue(JOURNAL_LIBRARY); return QSYSObjectPathName.toPath(lib, name, "JRN"); } return name; case SAVE_FILE: String name2 = (String)o; if (name2.length() > 0) { String lib2 = (String)getValue(SAVE_FILE_LIBRARY); return QSYSObjectPathName.toPath(lib2, name2, "SAVF"); } return name2; case SOURCE_FILE: String name3 = (String)o; if (name3.length() > 0) { String lib3 = (String)getValue(SOURCE_FILE_LIBRARY); String member = (String)getValue(SOURCE_FILE_MEMBER); return QSYSObjectPathName.toPath(lib3, name3, member, "MBR"); } return name3; case OBJECT_SIZE: long multi = ((Integer)getValue(OBJECT_SIZE_MULTIPLIER)).longValue(); long size = ((Integer)o).longValue(); return new Long(multi*size); case SAVE_SIZE: long multi2 = ((Integer)getValue(SAVE_SIZE_MULTIPLIER)).longValue(); long size2 = ((Integer)o).longValue(); return new Long(multi2*size2); case LICENSED_PROGRAM: case COMPILER: // pppppppVvvRrrMmm -- For example: "5761SS1V06R01M00" String lpp = (String)o; if (lpp.length() == 0) return null; else if (lpp.length() < 16) { if (Trace.traceOn_) Trace.log(Trace.WARNING, "Disregarding COMPILER attribute value in nonstandard format: " + lpp); return null; } else { String prodID = lpp.substring(0,7); StringBuffer release = new StringBuffer(6); release.append('V'); release.append(Integer.parseInt(lpp.substring(8,10))); release.append('R'); release.append(Integer.parseInt(lpp.substring(11,13))); release.append('M'); release.append(Integer.parseInt(lpp.substring(14,16))); return new Product(system_, prodID, Product.PRODUCT_OPTION_BASE, release.toString(), Product.PRODUCT_FEATURE_CODE); } case USER_CHANGED: case ALLOW_CHANGE_BY_PROGRAM: case CHANGED_BY_PROGRAM: case OVERFLOWED_ASP: case JOURNAL_STATUS: case JOURNAL_IMAGES: case DIGITALLY_SIGNED: case DIGITALLY_SIGNED_TRUSTED: case DIGITALLY_SIGNED_MULTIPLE: return new Boolean (((String)o).charAt(0) == '1'); case USAGE_INFO_UPDATED: return new Boolean (((String)o).charAt(0) == 'Y'); case JOURNAL_OMITTED_ENTRIES: return new Boolean(((String)o).charAt(0) == '0'); default: return o; } } catch (NumberFormatException e) { Trace.log(Trace.ERROR, "Invalid number conversion for attribute " + attribute, e); throw new InternalErrorException(InternalErrorException.UNKNOWN, e); } } /** * Returns the value of the given attribute of this ObjectDescription, as a String. If the value is not found, * it is retrieved from the system. The values are cached. *

* Performance hint: If multiple attribute values are to be retrieved for a * single ObjectDescription, first call {@link #refresh refresh()} to retrieve * (and cache) all of the known attributes of this object from the system. * @param attribute One of the attribute constants. * @return The value for the attribute, or null if one was not found. * @throws AS400Exception If an error occurs. * @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. * @exception ObjectDoesNotExistException If the system API that retrieves object information is missing. **/ public String getValueAsString(int attribute) throws AS400Exception, AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException { if (attribute == COMPILER) { // Either "", "pppppppVvvRrrMmm", or a 6- or 7-digit number in the format "wwmmdd" or "wwwmmdd", where ww = the week number (www = week# *10), mm = month and dd = day. Object o = values_.get(attribute); if (o == null) { if (attribute == ORDER_IN_LIBRARY_LIST) { // Can only retrieve this via ObjectList return "-1"; } retrieve(attribute); o = values_.get(attribute); } String lpp = (String)o; if (lpp.length() == 0) return null; else return lpp; } else { Object value = getValue(attribute); if (value == null) return null; else if (value instanceof String) return (String)value; else return value.toString(); } } /** Returns a list of all ObjectLockListEntry objects representing possible Object Locks on this ObjectDescription.

This method retrieves the list of locks from the system via a call to the List Object Locks (QWCLOBJL) API. Note: The QWCLOBJL API is not thread safe. @return An array of ObjectLockListEntry representing any Object Locks. If no locks are found, an empty array is returned. * @throws AS400Exception If an error occurs. * @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. @exception ObjectDoesNotExistException If the system API that retrieves object information is missing. **/ public ObjectLockListEntry[] getObjectLockList() throws AS400Exception, AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException { final int systemCCSID = system_.getCcsid(); CharConverter conv = new CharConverter(systemCCSID); String aspDeviceName = getAspDeviceName(); ProgramParameter[] parms = new ProgramParameter[(aspDeviceName.length() == 0) ? 6 : 9]; // Allow optional parameters if ASP device name is set parms[0] = new ProgramParameter(conv.stringToByteArray(USERSPACE_NAME)); //Qualified user space name parms[1] = new ProgramParameter(conv.stringToByteArray(FORMAT_NAME)); // Format Name String objectNameBuff = path_.toQualifiedObjectName(); // [10-char objectName] + [10-char libraryName] parms[2] = new ProgramParameter(conv.stringToByteArray(objectNameBuff)); // Qualified Object Name (10-ObjectName 10- Library) StringBuffer objTypeBuff = new StringBuffer("* "); // initialize to 10 blanks (with preceding asterisk) objTypeBuff.replace(1, getType().length(), getType()); parms[3] = new ProgramParameter(conv.stringToByteArray(objTypeBuff.toString())); // Object type parms[4] = new ProgramParameter(conv.stringToByteArray("*NONE ")); // Member Name parms[5] = errorCode_; if(parms.length == 9) // Add Optional parameters { parms[6] = new ProgramParameter(conv.stringToByteArray("")); // Optional parm - pathName (Leave blank, so ignored) parms[7] = new ProgramParameter(BinaryConverter.intToByteArray(0)); // Optional parm - pathNameLength StringBuffer aspDeviceNameBuff = new StringBuffer(" "); // ASP name - initialize to 10 blanks aspDeviceNameBuff.replace(0, aspDeviceName.length(), aspDeviceName); parms[8] = new ProgramParameter(conv.stringToByteArray(aspDeviceNameBuff.toString())); // Optional parm - Qualified ASP Name } // QWCLOBJL is the API used to get the list of object locks into a user space. // Note: QWCLOBJL is not documented to be thread-safe. // But if the user has indicated they want all programs to be called on-thread // (by setting the ProgramCall.threadSafe property), we will do as they wish. ProgramCall pc = new ProgramCall(system_, "/QSYS.LIB/QWCLOBJL.PGM", parms); // Note: The called API is not thread-safe. // Determine the needed scope of synchronization. Object lockObject; boolean willRunProgramsOnThread = pc.isStayOnThread(); if (willRunProgramsOnThread) { // The calls will run in the job of the JVM, so lock for entire JVM. lockObject = USERSPACE_PATH; } else { // The calls will run in the job of the Remote Command Host Server, so lock on the connection. lockObject = system_; } byte[] buf = null; synchronized (lockObject) { // Create a user space in QTEMP to receive output. UserSpace space = new UserSpace(system_, USERSPACE_PATH); space.setMustUseProgramCall(true); // need to use same job as the ProgramCall object if (!willRunProgramsOnThread) { space.setMustUseSockets(true); // Force the use of sockets when running natively but not on-thread. // We have to do it this way since UserSpace will otherwise make a native ProgramCall, and will use a different QTEMP library than that used by the host server. } try { space.create(256*1024, true, "", (byte)0, "User space for UserObjectsOwnedList", "*EXCLUDE"); // Note: User Spaces by default are auto-extendible (by QUSCRTUS API) // So it will always have enough space available. // Allocated 256K bytes as a reasonable initial size (1500+ entries) if (!pc.run()) { throw new AS400Exception(pc.getMessageList()); } // Get the results from the user space. int size = space.getLength(); if (size < 144) // Size of General header info that we are interested in { Trace.log(Trace.ERROR, "User Space size is too small (" + size + ")"); throw new InternalErrorException(InternalErrorException.UNKNOWN, size); } buf = new byte[size]; space.read(buf, 0); } finally { // Delete the temporary user space, to allow other threads to re-create and use it. try { space.delete(); } catch (Exception e) { Trace.log(Trace.ERROR, "Exception while deleting temporary user space", e); } } } // -------------------------------------------------------------------------------------------- // QWCLOBJL (List Object Locks) is a "list" API. // It puts the list of lock information in a user space. In addition, to the QWCLOBJL documentation, // the developer must refer to additional documentation describing the data returned: // - User spaces: List APIs return data to user spaces. To provide a consistent design and // use of user space objects, the list APIs use a general data structure. // - General data structure & Common data structure format (General header format 0100) // - This format in info center describes the general header format (referenced in the // code below). // - This information is/was documented in info center under the following: // - Programming -> API Concepts -> User spaces and receiver variables -> User spaces // -------------------------------------------------------------------------------------------- // Parse the list data returned in the user space. //int headerOffset = BinaryConverter.byteArrayToInt(buf, 116); // General header - Offset to header section int startingOffset = BinaryConverter.byteArrayToInt(buf, 124); // General header - Offset to list data section int numEntries = BinaryConverter.byteArrayToInt(buf, 132); // General header - Number of list entries int entrySize = BinaryConverter.byteArrayToInt(buf, 136); // General header - Size of each entry int entryCCSID = BinaryConverter.byteArrayToInt(buf, 140); // General header - CCSID of data in the list entries //String subsettedListIndicator = conv.byteArrayToString(buf, 149, 1); // General header - Subsetted list indicator String informationStatus = conv.byteArrayToString(buf, 103, 1); // General header - info status // informationStatus - 'C'=Complete, 'I'=Incomplete, 'P'=Partial if (entryCCSID == 0) entryCCSID = systemCCSID; // From the API spec: "The coded character set ID for data in the list entries. If 0, then the data is not associated with a specific CCSID and should be treated as hexadecimal data." conv = new CharConverter(entryCCSID); String jobName, jobUserName, jobNumber, lockState, memberName, share, lockScope; int lockStatus, lockType; long threadID; // ----------------------------------------------------------------------------------------- // Extract fields from the QWCLOBJL Specific Header // ----------------------------------------------------------------------------------------- //String userSpaceNameUsed = conv.byteArrayToString(buf, headerOffset+0, 10).trim(); // QWCLOBJL Specific Header - UserSpaceName //String userSpaceLibaryNameUsed= conv.byteArrayToString(buf, headerOffset+10, 10).trim(); // QWCLOBJL Specific Header - UserSpaceLibraryName if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "ObjectDescription.getObjectLockList() informationStatus='"+informationStatus+"' "+"' numEntries='"+numEntries+"'"); ObjectLockListEntry[] entries = new ObjectLockListEntry[numEntries]; try { // Extract the fields from each entry in the list int offset = startingOffset; for (int i=0; i 2GB, we need the save size in units & multiplier. case LAST_USED_DATE: case USAGE_INFO_UPDATED: case DAYS_USED: case OBJECT_SIZE: case OBJECT_SIZE_MULTIPLIER: case COMPRESSION: case ALLOW_CHANGE_BY_PROGRAM: case CHANGED_BY_PROGRAM: case USER_DEFINED_ATTRIBUTE: case OVERFLOWED_ASP: case SAVE_ACTIVE_DATE: case AUDITING: case PRIMARY_GROUP: case JOURNAL_STATUS: case JOURNAL: case JOURNAL_LIBRARY: case JOURNAL_IMAGES: case JOURNAL_OMITTED_ENTRIES: case JOURNAL_START_DATE: case DIGITALLY_SIGNED: //case SAVE_SIZE_UNITS: case SAVE_SIZE_MULTIPLIER: case LIBRARY_ASP_NUMBER: case OBJECT_ASP_DEVICE_NAME: case LIBRARY_ASP_DEVICE_NAME: case DIGITALLY_SIGNED_TRUSTED: case DIGITALLY_SIGNED_MULTIPLE: return 400; default: throw new ExtendedIllegalArgumentException("attribute", ExtendedIllegalArgumentException.PARAMETER_VALUE_NOT_VALID); } } private static final int lookupSize(int format) { switch (format) { case 100: return 90; case 200: return 180; case 300: return 460; case 400: return 667; //@O3C Fix Object Description size for OBJD0400 format. Refer http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_72/apis/qusrobjd.htm default: return 0; } } /** * Retrieves all possible attributes of this object from the system. * @throws AS400Exception If an error occurs. * @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. * @exception ObjectDoesNotExistException If the system API that retrieves object information is missing. **/ public void refresh() throws AS400Exception, AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException { retrieve(DIGITALLY_SIGNED_MULTIPLE); } /** * This method makes the actual program call to retrieve the attributes. **/ private void retrieve(int attribute) throws AS400Exception, AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException { if (system_ == null) throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_SET); int ccsid = system_.getCcsid(); ConvTable conv = ConvTable.getTable(ccsid, null); String aspDeviceName = getAspDeviceName(); int format = lookupFormat(attribute); int size = lookupSize(format); AS400Text text10 = new AS400Text(10, ccsid, system_); ProgramParameter[] parms = new ProgramParameter[(aspDeviceName.length() == 0) ? 5 : 7]; // @550C changed to allow seven parameters if asp device name is specified parms[0] = new ProgramParameter(size); // receiver variable parms[1] = new ProgramParameter(BinaryConverter.intToByteArray(size)); // length of receiver variable parms[2] = new ProgramParameter(conv.stringToByteArray("OBJD0"+format)); String objectNameAndLibrary = path_.toQualifiedObjectName(); // [10-char objectName] + [10-char libraryName] parms[3] = new ProgramParameter(conv.stringToByteArray(objectNameAndLibrary)); // object and library name parms[4] = new ProgramParameter(text10.toBytes("*"+getType())); // object type if(parms.length == 7) // @550A add error code and asp control parameters { // @550A parms[5] = new ProgramParameter(new byte[8]); // @550A Error Code // Construct the ASP Control Format byte[] controlFormat = new byte[24]; // @550A System.arraycopy(BinaryConverter.intToByteArray(24), 0, controlFormat, 0, 4); // @550A for(int i=4; i= 200) { set(EXTENDED_ATTRIBUTE, conv.byteArrayToString(data, 90, 10).trim()); set(TEXT_DESCRIPTION, conv.byteArrayToString(data, 100, 50).trim()); set(SOURCE_FILE, conv.byteArrayToString(data, 150, 10).trim()); set(SOURCE_FILE_LIBRARY, conv.byteArrayToString(data, 160, 10).trim()); set(SOURCE_FILE_MEMBER, conv.byteArrayToString(data, 170, 10).trim()); } if (format >= 300) { set(SOURCE_FILE_UPDATED_DATE, conv.byteArrayToString(data, 180, 13)); // date set(SAVE_DATE, conv.byteArrayToString(data, 193, 13)); // date set(RESTORE_DATE, conv.byteArrayToString(data, 206, 13)); // date set(CREATOR_USER_PROFILE, conv.byteArrayToString(data, 219, 10).trim()); set(CREATOR_SYSTEM, conv.byteArrayToString(data, 229, 8).trim()); set(RESET_DATE, conv.byteArrayToString(data, 237, 7)); // date-7 //set(SAVE_SIZE, (long)BinaryConverter.byteArrayToInt(data, 244)); // See 400 format section for more on save size. set(SAVE_SEQUENCE_NUMBER, BinaryConverter.byteArrayToInt(data, 248)); set(STORAGE_STATUS, conv.byteArrayToString(data, 252, 10).trim()); set(SAVE_COMMAND, conv.byteArrayToString(data, 262, 10).trim()); set(SAVE_VOLUME_ID, conv.byteArrayToString(data, 272, 71)); set(SAVE_DEVICE, conv.byteArrayToString(data, 343, 10).trim()); set(SAVE_FILE, conv.byteArrayToString(data, 353, 10).trim()); set(SAVE_FILE_LIBRARY, conv.byteArrayToString(data, 363, 10).trim()); set(SAVE_LABEL, conv.byteArrayToString(data, 373, 17).trim()); set(SYSTEM_LEVEL, conv.byteArrayToString(data, 390, 9)); set(COMPILER, conv.byteArrayToString(data, 399, 16).trim()); set(OBJECT_LEVEL, conv.byteArrayToString(data, 415, 8).trim()); set(USER_CHANGED, conv.byteArrayToString(data, 423, 1)); // '1' if the user changed the object, '0' if not. set(LICENSED_PROGRAM, conv.byteArrayToString(data, 424, 16).trim()); set(PTF, conv.byteArrayToString(data, 440, 10).trim()); set(APAR, conv.byteArrayToString(data, 450, 10).trim()); } if (format >= 400) { set(LAST_USED_DATE, conv.byteArrayToString(data, 460, 7).trim()); set(USAGE_INFO_UPDATED, conv.byteArrayToString(data, 467, 1)); // 'Y' was changed, 'N' was not. set(DAYS_USED, BinaryConverter.byteArrayToInt(data, 468)); set(OBJECT_SIZE, BinaryConverter.byteArrayToInt(data, 472)); set(OBJECT_SIZE_MULTIPLIER, BinaryConverter.byteArrayToInt(data, 476)); set(COMPRESSION, conv.byteArrayToString(data, 480, 1)); set(ALLOW_CHANGE_BY_PROGRAM, conv.byteArrayToString(data, 481, 1)); // '1' means it can be changed by QLICOBJD, '0' means not. set(CHANGED_BY_PROGRAM, conv.byteArrayToString(data, 482, 1)); // '1' means it has been changed by QLICOBJD, '0' means not. set(USER_DEFINED_ATTRIBUTE, conv.byteArrayToString(data, 483, 10).trim()); set(OVERFLOWED_ASP, conv.byteArrayToString(data, 493, 1)); // '1' means it overflowed the ASP it's in, '0' means not. set(SAVE_ACTIVE_DATE, conv.byteArrayToString(data, 494, 13)); // date set(AUDITING, conv.byteArrayToString(data, 507, 10).trim()); set(PRIMARY_GROUP, conv.byteArrayToString(data, 517, 10).trim()); set(JOURNAL_STATUS, conv.byteArrayToString(data, 527, 1)); // '1' means it is currently being journaled, '0' means not. set(JOURNAL, conv.byteArrayToString(data, 528, 10).trim()); set(JOURNAL_LIBRARY, conv.byteArrayToString(data, 538, 10).trim()); set(JOURNAL_IMAGES, conv.byteArrayToString(data, 548, 1)); // '1' means both before and after images are generated, '0' means just after images. set(JOURNAL_OMITTED_ENTRIES, conv.byteArrayToString(data, 549, 1)); // '0' means no entries are omitted (i.e. all entries are journaled), '1' means open/close ops don't generate entries, ' ' means object isn't journaled. set(JOURNAL_START_DATE, conv.byteArrayToString(data, 550, 13).trim()); // date; will be blank of not journaled set(DIGITALLY_SIGNED, conv.byteArrayToString(data, 563, 1)); // '1' means it has a digital signature, '0' means not. set(SAVE_SIZE, BinaryConverter.byteArrayToInt(data, 564)); set(SAVE_SIZE_MULTIPLIER, BinaryConverter.byteArrayToInt(data, 568)); set(LIBRARY_ASP_NUMBER, BinaryConverter.byteArrayToInt(data, 572)); set(OBJECT_ASP_DEVICE_NAME, conv.byteArrayToString(data, 576, 10).trim()); set(LIBRARY_ASP_DEVICE_NAME, conv.byteArrayToString(data, 586, 10).trim()); set(DIGITALLY_SIGNED_TRUSTED, conv.byteArrayToString(data, 596, 1)); // '1' means at least one signature came from a trusted source, '0' means none did. set(DIGITALLY_SIGNED_MULTIPLE, conv.byteArrayToString(data, 597, 1)); // '1' means there is more than one signature, '0' means there is only one or no signatures. } } void set(int attribute, int value) { values_.put(attribute, new Integer(value)); } void set(int attribute, long value) { values_.put(attribute, new Long(value)); } void set(int attribute, boolean value) { values_.put(attribute, new Boolean(value)); } void set(int attribute, Object value) { values_.put(attribute, value); } // @550A /** * Specifies the type of the search when a specific auxiliary storage pool device name * is specified for the ASP device name. * @param aspSearchType The type of search to be used. One of the following values may be specified: *

    *
  • {@link #ASP_SEARCH_TYPE_ASP ASP_SEARCH_TYPE_ASP} - Only the single ASP named will be searched.
  • *
  • {@link #ASP_SEARCH_TYPE_ASPGRP ASP_SEARCH_TYPE_ASPGRP} - All ASPs in the auxiliary storage pool * group named will be searched.
  • *
* The default value is {@link #ASP_SEARCH_TYPE_ASP ASP_SEARCH_TYPE_ASP}. * @exception ExtendedIllegalArgumentException if an invalid search type is specified. */ public void setAspSearchType(String aspSearchType) throws ExtendedIllegalArgumentException{ if (aspSearchType == null) throw new NullPointerException("aspSearchType"); if (!aspSearchType.equals(ASP_SEARCH_TYPE_ASP) && !aspSearchType.equals(ASP_SEARCH_TYPE_ASPGRP)) { throw new ExtendedIllegalArgumentException("aspSearchType", ExtendedIllegalArgumentException.PARAMETER_VALUE_NOT_VALID); } aspSearchType_ = aspSearchType; } /** * Returns a String representation of this ObjectDescription. * @return The object path name. **/ public String toString() { return getPath(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy